これは @Nobby とまったく異なる答えではありません。なぜなら、彼はレベルの進め方について正しいからです。ログを記録する前に IfXXXXEnabled チェックを行う必要はありません。
これは、ロギング呼び出しサイトの質問の C# コードに現在あるものです。
if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage);
@Nobbyは、これを行うことでこれをよりきれいにすることができると示唆しています:
if (logger.IsDebugEnabled) logger.Debug(logMessage);
if (logger.IsInfoEnabled) logger.Info(logMessage);
私はそれが本当だとは思いません。元のコードでは、デバッグ メッセージまたは情報メッセージのみがログに記録されます。ネストを削除すると、有効になっているログ レベルによっては、両方のメッセージがログに記録される可能性があります。
この方法でログを記録する必要があると思います:
logger.Debug(logMessage);
logger.Info(logMessage);
ロギング メソッド (logger.Debug、logger.Info など) は既に IsXXXEnabled チェックを行っており、そのロギング レベルが有効になっていない場合はログに記録されません。if
チェックで保護するのではなく、ロギング呼び出しを直接行うだけで、入力のログ (および混乱) を保存できます。
IsXXXEnabled チェックを使用したい場合があります。ログに記録する値を計算する作業があり、ログを記録している場合にのみその計算を行いたい場合など:
if (logger.IsDebugEnabled)
{
int value1 = DoSomeExpensiveCalculation();
int value2 = DoSomeOtherExpensiveCalculation();
logger.DebugFormat("v1 = {0}, v2 = {1}", value1, value2);
}
この方法では、実際にログに記録しない限り、計算の代償を払う必要はありません。
最後に、NLog 2.0 では、メッセージが実際にログに記録されない限り、コストがかかる可能性のある操作を延期できるラムダ構文にアクセスできます。
logger.Debug(() => string.Format("v1 = {0}, v2 = {1}", DoSomeExpensiveCalculation(), DoSomeOtherExpensiveCalculation()));
logger.Debug(() => "message" + i + ", " + j + "," + k);
どちらの場合も、DEBUG レベルが有効になっていない限り、NLog に渡される式は評価されません。