2012-03-07 13 views
0

現在、Spring MVCを使用しているWebアプリケーションで作業しています。アプリケーションのすべてのコントローラで@ExceptionHandlerアノテーションを使用しています。Spring MVCでのログイン

@ExceptionHandler(RuntimeException.class) 
public String handleException(RuntimeException ex) { 
    injectedService.notifyAndLogException(ex.getMessage()); 
    return ("error_page"); 
} 

私の考えは、ログインして注入されたサービスアプリケーションの管理者に電子メールを送信することです:

だから、基本的に私はこのような方法を得ました。 今のところ、Springアプリケーションのログインに関するいくつかのドキュメントを読み込もうとしましたが、私が見てきたことはそれぞれのコントローラにスタティックロガーを設定することです。このよう

private final Logger log = LoggerFactory.getLogger(Controller.class); 

@ExceptionHandler(RuntimeException.class) 
public String handleException(RuntimeException ex) { 
    log.info("Logging error"); 
    injectedService.notifyException(ex.getMessage()); 
    return ("error_page"); 
} 

私は一点のみ(サービス)でそれを使用するのではなく、各コントローラでロガーを使用するためのポイントが何であるかを知りたいですか?

答えて

4
私は1つのポイントでそれを使用するのではなく、各コントローラにのみ

あなたが全体のアプリケーションのための単一のロガーを使用する場合は、すべてのをロガーを使用するポイントは何か知りたい

ログメッセージは同じコンポーネントからのものとしてログに記録されます。クラスまたはコンポーネントごとにロガーを使用すると、ログファイルにに関する情報が含まれ、コンポーネントがメッセージを記録します。これは、一般的にログファイルに表示されますControllerクラスの名前、例えばとのロガーを作成します

Logger log = LoggerFactory.getLogger(Controller.class); 

:あなたはたとえば

 
2012-03-07:12:59:00 com.x.y.Controller Hello! 

これは単なる表記ですが、私があなたに従うことをお勧めします。

0

あなたのコントローラは、このロガーは、すべてのコントローラで使用することができる

protected Logger logger = LoggerFactory.getLogger(getClass()); 

などのロガーを宣言する抽象クラスを拡張することができ、それは、コントローラのクラス名を持つログメッセージの前に付けます。

+0

あなたはそうかもしれませんが、この種の継承は利便性のために反パターンであり、強く推奨されません。 – skaffman

+0

なぜ私に説明できますか? – tbruyelle

1

各クラスファイルのロガーを使用すると、実稼働中やデバッガに接続できないときに「デバッグ」または「情報」レベルを取得できます。

パッケージまたはクラスファイル名で制限することができるため、ログに記録される内容、ポイントを特定してエラーを見つけること、異なるロード状況(並行性の問題、使用されているリソース)で何が起こっているのかを確認できます。 1つの汎用ロガーを使用している場合は、ログファイルがあふれている可能性があります。

例外を受け取ったクラスのロガーで、例外ハンドラに渡されないクラス変数を取得することができます。

私はまた、あなたが

injectedService.notifyAndLogException(ex.getMessage()); 

行わないことをお勧めしますが、あなたの通知に例外を渡します。スタックトレースは冗長であるとは言い難いですが、通常はメッセージがいっぱいではありません(スタックトレースなしのNullPointerException?)。通知サービスでは、件名をex.getMessage()に設定し、本文にスタックトレース全体を設定できます。

関連する問題