ログに Log4perl を使用するモジョリッシュな Web アプリがあります。これはマルチ ユーザー アプリケーションであり、複数のユーザーがアプリケーションにアクセスしている場合、ログ ファイル内のさまざまなスレッドをたどることが難しい場合があります。私がやりたいことは、各ユーザー (人口は 25 ユーザー未満) のアクティビティを個別のファイルに記録することです。例: ./log/userX.log ./log/userY.log など。
構成ファイルで次のようなものを使用することを考えました: log4perl.appender.MAIN.filename=sub { return get_user_filename(); ただし、ロガーは Mojolicious スタートアップ サブルーチンで定義されており、ユーザーは要求時までわかりません。
より有望と思われるもう 1 つのアイデアは、ユーザーのアペンダーを作成し、それをロガーに割り当てるブリッジ ルートを作成することです。その後、後で再利用する (または破棄して再作成する) ためにアペンダーをキャッシュすることができます。
私は2番目のオプションで遊んでいますが、以前にこれを試みたことがあり、その知恵を共有したい人がいれば、それを感謝します.
-- 更新 -- 私のブリッジ ルートでは、次のことを行っています。
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 インストールです。何か案は?