5

Log4Jをロギングフレームワークとして使用する中規模のJavaWebアプリケーションがあります。現在、アプリケーションをより堅牢にするために、例外処理とロギングを行っています。フレームワークとしてSpring、Hibernate、Struts2を使用してTomcat6で実行されています。

私がやりたいのは、アプリケーションで発生するすべての未処理の例外をログに記録することです。それらをログに記録できるように、log4jに電子メールを送信させてから、try-catchブロックが欠落している場所を確認します。そして最後にそれに応じて私のコードを変更します。

原因現在、未処理の例外はすべて画面に直接印刷されており、ユーザーは通常、わざわざ例外をコピーする必要はありません。

tomcat-logsを読み取ることができることは知っていますが、そのような例外が発生するたびに電子メールを受信できるように、log4jで処理してもらいたいと思います。

助言がありますか?

4

2 に答える 2

5

Struts2を使用すると、特定のタイプのグローバル例外マッピングを定義できますException。java.lang.Exceptionに対して1つを定義すると、他の場所にマップされていない例外のキャッチオールとして機能します。

<global-exception-mappings>
  <exception-mapping exception="com.example.MyException result="myError" />
  <exception-mapping exception="java.lang.Exception" result="error" />
</global-exception-mappings>

<global-results>
  <result name="myError">/myError.jsp</result>
  <result name="error">/error.jsp</result>
</global-results>

エラーJSP(*)では、log4jを使用してログに記録し、混乱を招くスタックトレースに直面することなく、ユーザーに「問題が発生しました」というエラーページを表示できます。

(*)より良い:例外をログに記録してから、StrutsにJSPをレンダリングさせて、ユーザーに問題が発生したことを通知するエラーアクション。ロギングコードでJSPを乱雑にする必要はありません。

すべてのコードの変更について:

コード全体にキャッチブロックをやみくもに追加しないでください。コードの一部で例外を処理できない場合は、それを伝播させてください(throws必要に応じてメソッドシグネチャに句を追加してください)。スタックの特定のレベルで、スローされた例外をラップし、原因を特定して再スローするのに役立つ情報を追加することを検討してください。

 catch (IllegalArgumentException ex) {
    // Always pass the original exception along, never just the message.
    // It's much easier to find the root cause that way.
    throw new UpdateException("Failed to parse foo object: " + foo, ex);
 }

また、空のキャッチブロックの誘惑に抵抗します。彼らは例外を飲み込み、あなたはあなたのアプリケーションで何かまたは何がうまくいかないかもしれないことに気付かないかもしれません。例外に興味がないことが確実でない限り、すべての例外をログに記録します。

于 2012-04-21T14:28:49.587 に答える
0

カスタムエラーページを作成します。ここを参照してください:サーブレットによってランタイム例外がスローされたときにブラウザにユーザーフレンドリーなエラーページを表示するにはどうすればよいですか?

エラーページで、log4jで例外をログに記録するJavaコードを追加できます。

注:JavaコードをJSPに入れることは一般的に悪い習慣と考えられていますが、エラーのあるJSPにログインすることは、許容できると思う場所の1つです。

于 2012-04-21T14:28:05.357 に答える