我有一个使用 Log4perl 进行日志记录的 mojolicious 网络应用程序。这是一个多用户应用程序,当多个用户访问应用程序时,有时很难跟踪日志文件中的各种线程。我想做的是将每个用户(人口少于 25 个用户)的活动记录到一个单独的文件中。例如 ./log/userX.log ./log/userY.log 等。
我考虑在配置文件中使用类似的东西: log4perl.appender.MAIN.filename=sub { return get_user_filename(); 但是记录器是在 Mojolicious 启动子例程中定义的,用户直到请求时间才知道。
另一个似乎更有希望的想法是编写一个桥接路由,为用户创建一个附加程序,然后将其分配给记录器。然后我可以缓存附加程序以供以后重用(或销毁并重新创建)。
我将使用第二种选择,但如果有人以前尝试过这样做并想分享他们的智慧,我将不胜感激。
-- 更新 -- 所以在我的桥梁路线中,我正在执行以下操作:
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/user.log(长度为零)Log::Log4perl 的最新 CPAN 安装。有任何想法吗?