3

私のCatalystプロジェクトでは、コマンドラインアプリケーションとMoose互換性のある独自の例外タイプを使用しています。Catalyst

Catalyst REST インターフェイスのクライアントにエラー メッセージを提供するために、codehttp ステータス コードを例外クラスの一部として提供するサブルーチンを実装しました。Plack::Middlewareこのように、のポッドのドキュメントに記載されているように使用したいと思いPlack::Middleware::HTTPExceptionsます。

すべて正常に動作します。例外は、私が望む方法でクライアントに返されます。

私の問題は次のとおりです。例外をスローすると、それがミドルウェアによって捕捉され、ロギング ( ) が失われ、の Web サーバーの perl スクリプト出力Log::Log4perlにトレースもエラーも見つかりません。Catalyst

例外クラスによってカプセル化されていないがまれな文字列 ( などdie "BOOM!") であるエラーをスローするたびに、ログ出力が書き込まれ、エラーが文書化されます (明らかに、エラーはキャッチされCatalyst、再スローされません)。

Catalyst例外をミドルウェアに再スローする必要がある場合でも、ログ要求を保持するように指示するにはどうすればよいですか?

4

2 に答える 2

0

Neil の回答には、Catalyst アプリケーションに適用したいくつかの正しいステートメントが含まれていますが、出力は得られませんでした。サブクラス化することで、この問題を回避しCatalyst::Engineます。このサブクラスは再定義finalize_errorのみを行っており、残りの機能は変更されていません。独自の例外タイプを見つける場合は、個別の応答本文とステータス コードを設定して、例外「はしごを上に」再スローするのと同じ結果を達成します。

于 2014-05-22T11:23:43.977 に答える
0

この質問には 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 つの設定が行われています。

  1. 基本的に、コンテキストロガーをLog::Log4perl::Catalystに設定します$c->log

  2. PSGI ミドルウェアPlack::Middleware::Log4perlをロードします。psgi_middlewareCatalyst 構成をロードするときに、実際には構成キーを介してこれを行います。したがって、すべてが既に「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 タイプのクラスに関して追加したい特別な機能がまだいくつかあります。

于 2014-03-31T01:42:59.933 に答える