2013-08-21 5 views
2

로깅을 위해 Log4perl을 사용하는 mojolicious 웹 앱이 있습니다. 이것은 다중 사용자 응용 프로그램이며 둘 이상의 사용자가 응용 프로그램에 액세스 할 때 로그 파일의 다양한 스레드를 따라 가기가 때때로 어려운 경우가 있습니다. 내가 뭘하고 싶은지는 각 사용자 (인구가 25 명 미만인 사용자)가 별도의 파일에 기록하도록하는 것입니다. 예 : ./log/userX.log ./log/userY.log 등Log4perl을 사용하여 사용자 별 로그 파일을 만들 수 있습니까?

구성 파일에서 이와 비슷한 것을 사용하려고 생각했습니다 : log4perl.appender.MAIN.filename = sub {return get_user_filename(); } 로거가 Mojolicious 시작 서브 루틴에 정의되어 있으며 요청 시간까지 사용자를 알 수 없습니다.

더 유망 해 보이는 또 다른 아이디어는 사용자를위한 appender를 만든 다음 로거에 할당하는 브리지 경로를 작성하는 것입니다. 그런 다음 나중에 재사용 (또는 삭제 및 재 작성) 할 수 있도록 appender를 캐시 할 수 있습니다.

나는 두 번째 옵션으로 게임을 진행할 예정이지만, 이전에이 작업을 시도하고 지혜를 공유하고 싶다면 고맙게 생각합니다.

- 업데이트 - 그래서 내 다리 경로에서 나는 다음과 같은 일을 해요 :

my $user = $self->req->headers->header('authuser'); # from apache 
my $appender = Log::Log4perl::Appender->new(
    'Log::Log4perl::Appender::File', 
    name => $user . "_file_appender", 
    filename => "/tmp/$user.log", 
    mode => "append", 
); 
$appender->layout($layout); # previously defined 
$appender->level($loglevel); # again previously defined and omitted for brevity 
Log::Log4perl::get_logger($user)->add_appender($appender); 
$self->app->log(Log::Log4perl::get_logger($user)); 

나는 다음과 같은 오류를 받고 있어요, 그러나 :

Can't locate object method File:() in Log::Log4perl::Appender at  /usr/local/share/perl/5.14.2/Log/Log4perl/Appender.pm line 282, <DATA> line 747. 

/tmp를/사용자 .log는 생성되지만, 길이는 0입니다. 최신 CPAN instal of Log :: Log4perl. 어떤 아이디어?

+1

DBI에 로깅하는 것이 고려 되었습니까? 이렇게하면 이벤트 후 사용자별로 분할/필터링하는 것이 쉬울 것입니다. –

+0

예,하지만 DBI 데이터베이스를 사용하고 있지 않습니다. (나는 다른 모듈을 가진 12 개의 다른 DB 중에서 선택할 수 있음을 알고있다.) 파일은 읽기 쉽고 조작하기 쉬운 나의 욕망이다. – Todd

+0

오류는 오타가 원인 일 수 있습니다. 그것은 Appender 클래스에서 "File :"을 찾고 있습니다. 아마 철자가 잘못된 ":: File"어딘가. –

답변

1

리처드의 의견이 마음에 들었고 이미 DB 경로를보고 싶지 않다고 말하기 전에이 내용을 썼습니다. 그래서 나는 그것을 다른 사람들을 위해 포함시킨다. 옆으로 : 나는 DB 로깅이 때로는 꽤 무거운 것 같아요. 개인적으로는 보통 파일도 선택합니다. 요청/파견주기의 상단에

어딘가에 (촉매 예 참조) - Log4perl가

log4perl.appender.toDBI     = Log::Log4perl::Appender::DBI 
log4perl.appender.toDBI.Threshold   = INFO 
log4perl.appender.toDBI.layout   = Log::Log4perl::Layout::NoopLayout 
log4perl.appender.toDBI.datasource  = sub { "DBI:mysql:" . db_name_function() } 
log4perl.appender.toDBI.attrs.f_encoding = utf8 
log4perl.appender.toDBI.username   = db_username 
log4perl.appender.toDBI.password   = s3cr37 
log4perl.appender.toDBI.sql    = INSERT INTO toDBI \ 
                 (user, file, line, message) \ 
                VALUES (?, ?, ?, ?) 
log4perl.appender.toDBI.usePreparedStmt = 1 
log4perl.appender.toDBI.params.1   = %X{user} 
log4perl.appender.toDBI.params.2   = %F 
log4perl.appender.toDBI.params.3   = %L 
log4perl.appender.toDBI.params.4   = %m 

는 지금까지 파일을 이동, 나는 그것을 할 수 있다고 생각 config-에 그런

Log::Log4perl::MDC->put("user", $ctx->user_exists ? $ctx->user->id : 0); 

가능하지만 재미는별로 없으며, 버그를 일으킬 가능성이 있으며, 과장됩니다. 로깅에 user:{userid}과 같은 것을 추가하는 것은 간단합니다. grep/ack은 사용자의 요청/로그 스레드를 정확하게 얻기위한 로그 파일입니다.

+0

제안 해 주셔서 감사합니다. 위로 사용자 param 및 grep 사용하여하지만 위의 내 코드를 느낀다 가까운. 왜 내가 오류가 점점 확실하지 않습니다. – Todd

+0

다음 시도하고 무슨 일이 일어날 지 볼 것이다 : 인라인 및 "이전에 정의 된" 레이아웃, 레벨 인라인, 화면 로그로 변경하십시오.이 중 하나는 파일 appender 문제가 어디에 있는지를 보여줍니다. – Ashley