2

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

4

1 回答 1

1

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

在请求/调度周期顶部的某个地方(催化剂示例)-

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

然后在 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

就文件而言,我认为它可能是可能的,但不会很有趣,似乎可能会引入错误,并且可能是过度的。user:{userid}将类似的内容添加到您的日志记录中,然后添加grep/ack日志文件以准确获取用户的请求/日志线程是微不足道的。

于 2013-08-21T19:37:00.183 回答