2010-11-30 7 views
1

Nlogを使用しているC#アプリケーションに次のコードがあります。 'Debug'のメッセージは記録されますが、 'Info'は記録されません。私は、MinLevelがapp.configの 'Debug'に設定されているので、 'Info'よりもDebugの方が優先順位が高いので、 'Info'メッセージもログに記録されると想定していました。しかし、彼らは記録されません。どこが間違っていますか?最低レベルがデバッグのときに情報レベルのメッセージが記録されないのはなぜですか?

ありがとうございました。

if (logger.IsDebugEnabled) logger.Debug(logMessage) else if (logger.IsInfoEnabled)log.Info(logMessage); 

これはあなたの問題はあなたの例であればネストされたステートメントである

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 

<targets> 
    <target name="file" xsi:type="File" fileName="E:/Logoutputs/Remissol-Nlog.txt" /> 
</targets> 

<rules> 
    <logger name="*" minlevel="Debug" writeTo="file" /> 
</rules> 

答えて

3

これは、彼がレベルの方法について正しいので、これは@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); 

私はそれが本当に真実だとは思わない。元のコードでは、デバッグメッセージまたはInfoメッセージのみがログに記録されます。ネストを削除すると、有効になっているロギングレベルに応じて、両方のログメッセージがログに記録される可能性があります。私はあなたがこの方法をログに記録されるべきだと思う

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); 
} 

あなたがない限り、計算の価格を払っていない。この方法を実際にログに記録します。どちらの場合も

logger.Debug(() => string.Format("v1 = {0}, v2 = {1}", DoSomeExpensiveCalculation(), DoSomeOtherExpensiveCalculation())); 

logger.Debug(() => "message" + i + ", " + j + "," + k); 

、NLogに渡されているの式:

最後に、NLog 2.0に次のメッセージが実際にログに記録されていない限り、あなたが潜在的に高価な操作を延期することができるようになるラムダ構文へのアクセス権を持っていますDEBUGレベルが有効になっていないと評価されません。

2

を設定するapp.configをです。 DebugファイルとInfoログの両方のレベルは、設定ファイルに従って有効になっています。条件が真であるため、最初のif文が評価され、そのブロックが実行されます。したがって、elseブロックには到達せず、Infoメッセージは記録されません。

DebugおよびInfoレベルのメッセージを記録する場合は、ネストされたif文を2つの別々の文に分割することをお勧めします。

関連する問題