この質問には 2 つの部分があるように見えますが、これでカバーできると思います。エラーをログに記録するように Log4perl をセットアップするという問題の方が実際には問題ですが、Catalyst と Plack に関する考慮事項があります。
まず、これは私が持っている典型的なlog4perl構成セットアップです:
log4perl.logger = DEBUG, FileAppndr, Screen, DebugPanel
log4perl.appender.FileAppndr = Log::Log4perl::Appender::File
log4perl.appender.FileAppndr.filename = log/server.log
log4perl.appender.FileAppndr.autoflush = 1
log4perl.appender.FileAppndr.stderr = 1
log4perl.appender.FileAppndr.layout = PatternLayout
log4perl.appender.FileAppndr.layout.ConversionPattern=%d [%p] - %m%n
log4perl.appender.Screen = Log::Log4perl::Appender::Screen
log4perl.appender.Screen.stderr = 1
log4perl.appender.Screen.autoflush = 1
log4perl.appender.Screen.layout = PatternLayout
log4perl.appender.Screen.layout.ConversionPattern=%d [%p] - %m%n
stderr
そこに として値が含まれていることに注意してください1
。したがって、これは log4perl にstderr
ロギング用にキャプチャするように指示します。
Catalyst 側では、実際にはコンテキスト用の非常にカスタムな初期化コードがいくつかありますが、基本的に 2 つの設定が行われています。
基本的に、コンテキストロガーをLog::Log4perl::Catalystに設定します$c->log
PSGI ミドルウェアPlack::Middleware::Log4perlをロードします。psgi_middleware
Catalyst 構成をロードするときに、実際には構成キーを介してこれを行います。したがって、すべてが既に「Plack::Middleware」コンテキスト パスにあるため、「Log4perl」以外の設定行には何もありません。
2 番目の部分は、ロードされた「log4perl」インスタンスを「ピックアップ」してに割り当て、psgi.logger
必要に応じて PSGI コンポーネントがロガーにアクセスできるようにします。
したがって、次のようなコードで「再スロー」される以降のステートメントはすべて次のようになります。
my $e = HTTP::Exception->new(404);
$e->status_message("BOOM!!");
$e->throw;
die
生のステートメントと同様に、実際には「log4perl」出力で取得されます。
少なくとも Catalyst 5.90060 以降ではそうです。HTTP::Exception タイプのクラスに関して追加したい特別な機能がまだいくつかあります。