1

Nlog を使用して、C# アプリケーションに次のコードがあります。「Debug」を含むメッセージはログに記録されますが、「Info」は記録されません。app.config で minLevel が「Debug」に設定されているため、Debug は「Info」よりも優先度が高いため、「Info」メッセージもログに記録されると想定していました。しかし、それらはログに記録されません。どこが間違っていますか?

ありがとう。

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

これは app.config 設定です

<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>

4

2 に答える 2

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

私はそれが本当だとは思いません。元のコードでは、デバッグ メッセージまたは情報メッセージのみがログに記録されます。ネストを削除すると、有効になっているログ レベルによっては、両方のメッセージがログに記録される可能性があります。

この方法でログを記録する必要があると思います:

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 に渡される式は評価されません。

于 2010-11-30T16:38:18.637 に答える
2

問題は、例のネストされた if ステートメントにあります。構成ファイルに従って、Debug と Info の両方のログ レベルが有効になります。条件が真であるため、最初の if ステートメントが評価され、そのブロックが実行されます。したがって、else ブロックに到達することはなく、Info メッセージがログに記録されることもありません。

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

于 2010-11-30T11:13:41.420 に答える