1

トラブルシューティング上の理由から、例外が発生した場合は過去のすべてのメッセージ (たとえば、最後の 20 件) を TRACE レベルでログに記録したいのですが、コードが正常に機能する場合は、ログ ファイルをクリアしておくために INFO レベルからログを記録したいと考えています。不要なログ メッセージ。

例えば:

public void m( String arg ){
    log.trace( "arg value: " + arg );
    log.info( "Hi Bob!" );
    try{
        //code
    }catch( Exception e ){
         log.error( "error msg", e );
    }
}

次のようなログを取得したいと思います。

*INFO* Hi Bob!

しかし、エラーが発生した場合は、次のようなログを取得したいと思います:

*TRACE* arg value: test
*INFO* Hi Bob!
*ERROR* error msg //and stacktrace

言い換えれば、コードが正常に実行され、エラーが発生した場合にログ ファイルにプッシュされた場合に、低レベル メッセージからクリアされるログ メッセージ バッファが必要です。Javaロギングフレームワークはボックスからこれを行うことができますか?

4

3 に答える 3

2

残念ながら、log4jでそのようなことができるとは思えません。他に次の 2 つのことができると思います。

  1. エラーメッセージに必要な情報を書き込んでください(常に実用的であるとは限りません)

    log.error( "error with arg value " + arg, e );
    
  2. コンソールまたはログ ファイルにレベル INFO まで出力し、エラーが発生した場合にのみ調べる「detailed.log」と呼ばれる別のファイルにレベル TRACE まで出力するように log4j を構成します。その方法の詳細については、この質問を参照してください。

于 2013-02-20T22:55:14.833 に答える
1

更新 これを行う方法がないと言うのは誤りです。log4jを見てくださいMappedDiagnosticContextこれは良い指示のようです


これを行う方法はありません。

現在のトレースレベルがINFOであり、コードが次のロギング呼び出しを行うことを考慮してください。

  1. 痕跡
  2. 情報
  3. エラー

コードがダウンストリームに到達することを知る方法はないので、唯一の解決策はそれをバッファ#1リングすることです。次に、現在のレベルがであるため、ロギングを実行する必要があります。ERROR#2INFO

#3エラーが発生した場合、INFOログ#2はすでに発生しています。#1それをロールバックして、の前にトレースを挿入する方法はありません#2

ログに記録せず#2、メソッド/関数の実行が完了するのを待つことは、一般的に悪い考えです。それはあなたのために働くかもしれません、しかしあなたはログ行を逃してしまうかもしれません、そしてそれは悪いです。

最善のオプションは、エラーが発生した場合にログに記録する追加情報をメモリに保存することです(たとえば、ローカルスレッドに保存します)。したがって、出力は次のようになります。

10:15 INFO
10:20 ERROR
      10.10: TRACE

ロギングの大きなオーバーヘッドは、オブジェクトから書き込む文字列を作成することです。Callableしたがって、実際の文字列をバッファリングする代わりに、発言などを行う必要があります。そして、それはすべてかなり厄介になります。

于 2013-02-20T23:15:02.623 に答える
1

そのための標準構成はないと推測しています。エラーが発生した場合は、カスタムアペンダーを調べて、お気に入りのアペンダーを一種のバッファーでオーバーライドし、要素のみを追加します。

私の意見では、過去のことをログに記録するよりも、詳細なエラー メッセージをログに記録する方がよいかもしれません。

于 2013-02-20T22:51:18.837 に答える