로깅을 위해 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. 어떤 아이디어?
DBI에 로깅하는 것이 고려 되었습니까? 이렇게하면 이벤트 후 사용자별로 분할/필터링하는 것이 쉬울 것입니다. –
예,하지만 DBI 데이터베이스를 사용하고 있지 않습니다. (나는 다른 모듈을 가진 12 개의 다른 DB 중에서 선택할 수 있음을 알고있다.) 파일은 읽기 쉽고 조작하기 쉬운 나의 욕망이다. – Todd
오류는 오타가 원인 일 수 있습니다. 그것은 Appender 클래스에서 "File :"을 찾고 있습니다. 아마 철자가 잘못된 ":: File"어딘가. –