2011-10-28 13 views
3

私は、Spring、Hibernate、およびいくつかの他のライブラリ(ログ用のApache log4jを含む)を使用して大規模なJava Webアプリケーションを開発しています。私の進行中のプロジェクトの1つは、より合理的な情報を提供するために、コードのレガシー領域(私が書いていない!)で多数の例外を書き換えることです。典型的な例外ブロックは次のようになります。Javaでより優れた例外情報をログに記録する

try { 
    //Some Hibernate business here 
} 
catch (Exception e) { //Yes, Exception. That's not just me being general. I find this especially frustrating. 
    log4j.error("Fail to XXXXXX"); //again, real 
    throw new MyException(); 
} 

これは、いくつかの困難なログの原因となります。私はこれらの例外からより良い情報を得る標準的な方法を探しています。それらのほとんどは、Hibernateの呼び出しをラップします。私は、データベースからレコードを引き出し、それをリストに追加している。ここ

try { 
    myList.add(((myClass) commonService.getRecordByTableId(myClass.class, ID)).toString()); 
} catch (ServiceException e) { 
    log4j.error("Failed to retrieve record from table myClass for id " + ID); 
    e.printStackTrace(); 
} 

:ここで私はちょうど書いたのと同様の典型的なブロックです。 catchブロックでは、tryブロックが何をしているのか分かるメッセージを記録し、スタックトレースを出力します。だから、私の質問:エラーを診断するためのより良い情報を得るために、一般的に何か/私がやっているはずのことはありますか?

答えて

10

ロギングと再投げが人気のアンチパターンです:log4jのに例外を供給すると、コンテキストが理にかなっている、あなたのログファイルにそれを印刷します。あなたはそうしてはいけません。例外をキャッチし、それを適切に処理(ロギングを含む)するか、それをキャッチせずに上位レベルに渡すか(または再試行/チェック例外の場合は実行時例外にラップ)する必要があります。

これを行うと、上流のコードがすでに例外を記録していることを知る方法がないため、同じ例外が2回以上記録される可能性があります。例外が通過しなければならず、どの層がログに記録して再スローするかを任意に決定します。それは丸太を読んで、それらに完全な悪夢を放棄させるでしょう。

例外をスローしキャッチするのはコストのかかる操作であると主張できますが、このキャッチと再スローイングはすべて実行時のパフォーマンスには役立ちません。

実際に例外を処理することを選択した場合、それを飲み込むことは正しい方法ではありません(メッセージを記録しても)。少なくとも、あなたは、トレースをログに記録する必要があります。

log4j.error("Failed to retrieve record from table myClass for id " + ID, e); 
+2

+1。私ができるならば、もっと多くのポイントを与えるだろう。私はそれの前にいくつかの "エコー"があるスタックトレースを見るのに疲れています。 –

+1

はい、私もそうです。多くの "深刻な"開発者が、ほとんどの例外に対して十分に処理できるようにログと再利用を検討するのは驚くべきことです。 – Guillaume

+0

+1、よろしくお願いします。このプロジェクトで私が非常に悲しいことを起こしたことについてたくさんあります。私はそれを形にしようとしています。 :D – andronikus

1

うんは、非常に最初のブロックでは、それは次のようにする必要があります:あなたはそれを行う必要がありますので

try { 
    //Some Hibernate business here 
} 
catch (Exception e) { //Yes, Exception. That's not just me being general 
    log4j.error("Fail to XXXXXX", e); //again, real 
    throw new MyException(e); 
} 

Javaは連鎖例外にことができます。また、Log4Jを使用している場合は、例外スタックトレースをログに出力するように例外を送信することもできます。

4

printStackTrace()ログにトレースを追加しません。例外処理で

log4j.error("Failed to retrieve record from table myClass for id " + ID, e); 
2

他の人が言及しているものに加えて、物事のカップル:さまざまなログレベルの

  1. メイクの使用:情報;警告する;
  2. #1から続き、printStackTrace()呼び出しを削除します。コンソールにエラーを記録する場合は、ロガーを使用してエラーをログに記録します。そうすれば、コンソールであってもレベルをフィルタリングするメリットが得られます。
関連する問題