2013-08-21 37 views
2

我有一个使用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安装。有任何想法吗?

+1

您是否考虑过登录到DBI?这会让事件发生后用户易于分割/过滤。 –

+0

是的,但我没有使用DBI数据库。 (我知道,我可以从十几种不同的模块中选择不同的模块)文件是我的愿望,易于阅读和易于操作。 – Todd

+0

您的错误可能是由于输入错误。它正在寻找Appender类中的“File:”。据推测,某处是拼写错误的“:: File”。 –

回答

1

我喜欢理查德的评论,并且在你说你不想走数据库路线之前就已经写下了这条评论。所以我把它包括给其他人。除此之外:我认为数据库日志记录有时非常繁重,我个人通常也会选择文件。

某处在请求/调度周期的顶部(例如催化剂) -

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

然后在Log4perl config-

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 

至于文件去,我想可能是可能但不会很有趣,似乎可能会引入错误,并且可能是过度的。将user:{userid}添加到日志记录中,然后将grep/ack日志文件添加到日志文件中以获取用户的请求/日志线程是很简单的。

+0

感谢您的建议。回到使用用户参数和grep,但我觉得我上面的代码是接近的。不知道为什么我得到我错误虽然 – Todd

+0

我会尝试以下,看看会发生什么:内联和简化“以前定义”布局,内联关卡,将其更改为屏幕日志。其中一个可能会显示文件appender的问题在哪里。 – Ashley

相关问题