2009-05-07 3 views
2

나는 Catalyst (Perl 용 MVC 프레임 워크)를 사용하지만이 질문은 모든 MVC 프레임 워크에 적용됩니다.로그/통계를 저장하는 가장 좋은 방법

지금까지 아파치 로그 파일을 사용하여 사용자 에이전트, 액세스 한 URL, 시간 등 방문자에 대한 통계를 얻었습니다.하지만 이제는 MVC 프레임 워크로 이동 했으므로 충분하지 않다고 생각합니다./1/foo와/1/bar에 대한 요청이 동일한 경우, 예를 들어 내 로그에만/1 /을 표시하려고합니다.

그래서 통계에 대한 내 자신의 로그 파일을 생성하는 가장 좋은 방법은 궁금합니다. 내 응용 프로그램의 다른 로그 파일로 취급해야합니까?

이러한 통계는 언제든지 기록 할 수 있습니다. 이상적으로는 페이지가 사용자에게 전송 된 후에 로깅되므로 로깅에 필요한 추가 시간이 느껴지지 않습니다.

답변

4

Catalyst가 이미 서브 루틴 속성을 자유롭게 사용한다고 가정 할 때 하나의 유용한 접근법은 속성을 사용하여 사용자 정의 기록 메커니즘에서 관련 하위 항목을 래핑하는 것입니다. 예를 들어 로깅을 사용하는이 기술에 대해 an article이라고 썼습니다. 기본 아이디어는 다음과 같습니다.

use Attribute::Handlers; 

sub Log : ATTR(CODE) { 
    my ($pkg, $sym, $code) = @_; 


    my $name = *{ $sym }{NAME}; 

    no warnings 'redefine'; 

    *{ $sym } = sub { 
     log_message("Entering sub $pkg\:\:$name"); 
     $code->(@_); 
    }; 
} 

sub foo : Log { 
    # this will be logged 
} 
2

자유도가 필요한 경우 friedo의 대답은 대단합니다.

OTOH $c->log->info() 또는 그 형제 중 하나만 사용하여이 데이터를 계속 기록하려면 Apache error_log를 계속 사용할 수 있습니다. Catalyst :: Log를 확장하여 다른 종류의 메시지를보고하는 것은 비교적 간단합니다. 예를 들어, SQL :: Beautify를 통해 실행 된 error_log에 SQL을 쓰는 $c->log->sql() 변형을 사용합니다.

나는 당신이 원하는 것이 아니다 (자동으로) 시작에 그것을 퍼팅

sub auto { 
    ... 
    $c->log->audit(sprintf("%s called by %s", $c->action->reverse, $c->userid)); 
    ... 
} 

의 라인을 따라 뭔가를 상상할 수 있지만, 당신이 항상 호출되는 것을 알고 있기 때문에 그것을 달리, 확실히 덜 문제입니다 엔드 핸들러.

관련 문제