2010-12-07 16 views
16

私は人々が次のようにlog4netのロギングコードを書く参照理由として興味:なぜlog4netでIsDebugEnabledを呼び出しますか?

if (_logger.IsDebugEnabled) 
{ 
    _logger.Debug("Some debug text"); 
} 

私はlog4netのために解体を経て、およびデバッグを呼び出すことかどうかを確認するために同じコードに別の呼び出しを行いました実際にロギングする前に有効になっているため、IsDebugEnabled呼び出しは不要で、実際には重複したコードになります。

人々がこれを行う理由はありますか?古いバージョンでは以前は必要だったが、もはやそれはない古いパターンでしょうか?それとも正当な理由があるのでしょうか?あるいは、人々はそれをする必要がないことを知りませんか?

他のレベル(情報、エラー、ワーニング、ファインストなど)にも同様の動作があります。

+1

あなたの3人に感謝します。皆さんがほぼ同じ時間に鳴ったようですが、ブライアンが最初だと思います。私は本当に高価なメッセージについては考えていませんでした。私が一般的に行っているロギングは非常にシンプルで、通常は文字列です。しかし、実際にコードが実行された場合は、事前に停止することが間違いありません。助けてくれてありがとう。 –

+0

IsDebugとパフォーマンスの問題については、http://goo.gl/kMHNQ – sduplooy

+1

で説明しています。IMHO if文ですべてのログ呼び出しをラップするのは意味がありません。 DBコールや大量のデータ操作など、ログに記録する値の計算が高価な場合にのみ、私はそれを行います。シンプルな文字列連結によるパフォーマンスへの影響はごくわずかです。あなたはすべてのログステートメントに3行のコードを追加します。それは絶対に狂気です –

答えて

12

メッセージが作成に費用がかかる可能性があります。 ifステートメントでそれを折り返すと、必要なときにのみ作成されます。

この問題を解決するもう一つのパターンがある:log4netのは、そのようなものをサポートしている場合

_logger.Debug(() => "Some expensive text"); 

でも、私は知りません。

+1

拡張メソッドを作成できない場合でも。 – aqwert

+0

はさらに余分な "()=>"を必要としますが、改良の余地はありますか? –

+0

パフォーマンス上の理由だけではありません。既にデバッグレベルでログオンしていて、同じ情報が別のログレベルに再度記録されないようにするにはどうすればよいでしょうか?次に、このフラグを使用できます: 'if(!Log.IsDebugEnabled)Log.Error(something);'。この場合、「何か」は安価ではありませんが、同じ情報を2度は欲しません。 –

6

一部の操作では、必要なログメッセージを出力できるようにするために、計算または追加チェックが必要な場合があります。

ログレベルがDEBUGより高く設定されている場合は、これをすべて実行するのではなく、場合によってはログに記録されない場合に余分な作業が行われないようにすることもできます。

例として、ページロード時間をデバッグモードで記録することができますが、DEBUGレベルでない場合はストップウォッチを作成せず、計算をスキップする必要があります。

14

このパターンはパフォーマンス上の理由から、特に特定のロギングレベルへのロギングが現在ロギングレベルが有効になっていないためスキップされる場合にのみ使用されます。ブール値IsDebugEnabledフラグをチェックして、メソッド呼び出しをスキップするのは、引数を指定してDebugメソッドを呼び出す方法と、ロギングなしで返すメソッドよりもはるかに安い方法です。

Debugメソッドを呼び出して、作成に費用がかかっていたメッセージを渡す場合は、最初に有効フラグをチェックしてメッセージの作成をスキップすることができます。

非常に高価なログメッセージ(例えば、スタックトレースのようなもの)を作成していないか、タイトループでログインしている場合を除いて、それがあなたのボトルネックになることは考えにくいコード。

関連する問題