13

ここにifステートメントがあることのポイントは何ですか?重大度レベルは、log4j.xml構成ファイルで変更できます。重大度レベルがdebugの場合、デバッグメッセージがログに記録されます。それ以外の場合は、ログに記録されません。

以下のifステートメントの重要性は何ですか?

   if (log.isDebugEnabled())
    {
        log.debug("I am logging something");
    }
4

3 に答える 3

21

あなたの例では、'if'ステートメントは必要ありません('if'の間はループではありません)

ただし、以下の例を見ると、連結が行われていることがわかります。ログレベルが情報の場合、不必要にこの連結操作が実行されます。パフォーマンスを向上させるために、この状態を確認します。

if (log.isDebugEnabled())
{
    log.debug("I am logging " + 1234 + ".");
}

追加情報:

このようなif条件を回避するには、slf4jを使用してください。上記のステートメントは、slf4jで次のように書き直すことができます。

log.debug("I am logging {} .", 1234);
于 2012-05-03T09:29:42.007 に答える
2

これは良い習慣と考えられています。たとえば、文字列の連結がある場合、log4jで評価およびチェックされませんが、最初にチェックされます。

例:

if ( log.isDebugEnabled() ) {
    log.debug( "N=" + N + ", a=" + Arrays.toString( a ) );
}

Arrays.toString()デバッグが有効になっていない場合、メソッドおよび連結は実行されません。ない場合は、if最初に呼び出され、後でチェックされます。それだけです;-)

私の意見では、あなたの例のように単純な文字列がある場合、ロギングの周りは必要ありませんが、より複雑なもの(私の例のようにさらに複雑なもの)がある場合、これは本番モード(デバッグモードなし)でCPU時間を節約できます有効)。

連結の場合、String.valuOf()(nullオブジェクトではない)toString()メソッドを呼び出す呼び出しがあることも理解する必要があります。これは、ビジネスロジックを呼び出さないと考えると、ビッグデータオブジェクト(多くのプロパティを持つBean)のパフォーマンスの問題になる可能性があります(したがって、「役に立たない」)。

于 2012-05-03T09:23:29.233 に答える
2

これはパフォーマンスの最適化です。への引数の評価を避けるために行われlog.debugます。ログメッセージの作成に特に費用がかかる場合(XMLドキュメントのシリアル化など)にのみ行う価値があります。

これについては、 log4jの簡単な紹介で詳しく説明しています。

于 2012-05-03T09:26:30.967 に答える