我有一个使用Log4perl进行日志记录的mojolicious web应用程序。它是一个多用户应用程序,当多个用户访问应用程序时,有时很难跟踪日志文件中的各个线程。我想要做的是让每个用户(人口在25个以下的用户)活动记录到一个单独的文件。例如。 ./log/userX.log ./log/userY.log等是否可以使用Log4perl创建每个用户的日志文件?
我想到了在配置文件中使用这样的事情: log4perl.appender.MAIN.filename = {子回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正在创建,尽管(零长度)Log :: Log4perl的最新CPAN安装。有任何想法吗?
您是否考虑过登录到DBI?这会让事件发生后用户易于分割/过滤。 –
是的,但我没有使用DBI数据库。 (我知道,我可以从十几种不同的模块中选择不同的模块)文件是我的愿望,易于阅读和易于操作。 – Todd
您的错误可能是由于输入错误。它正在寻找Appender类中的“File:”。据推测,某处是拼写错误的“:: File”。 –