web-dev-qa-db-ja.com

NLogパフォーマンス

ロギングで予想されるオーバーヘッドは何ですか?私はこの例を試しました

 private class Person
 {
    private static Logger logger = LogManager.GetCurrentClassLogger();
    public string Name { get; private set; }
    public Person(string name)
       {
           Name = name;
           logger.Info("New person created with name {0}", name);
       }
  }

  List<Person> people = new List<Person>();
  for (int i = 0; i < MAXTEST; i++)
  {
      people.Add(new Person(i.ToString()));
  }

MAXTEST値が100、500、1000、5000の場合

MAXTEST、noLogging、Loggingの結果

100,  25ms, 186ms    
500,  33ms, 812ms    
1000, 33ms, 1554ms
5000, 33ms, 7654ms

おそらく、この過剰な量をログに記録することは決してないだろうが、これが予想されるパフォーマンスヒットになるかどうか。

私も設定でasyncwrapperを使ってみました

 <target name="asyncFile" xsi:type="AsyncWrapper">
   <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
 </target>
49
Eric

async属性をtargets要素に追加するだけです。

<targets async="true">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />

の代わりに

<targets>
    <target name="asyncFile" xsi:type="AsyncWrapper">
        <target name="file" xsi:type="File" fileName="${basedir}/log.txt" />
    </target>

私はドキュメントにそれほど深く入り込んでいないと思います;-)

非同期ターゲットラッパーを使用すると、メッセージをキューに入れて別のスレッドで処理することにより、ロガーコードをより迅速に実行できます。ロギングを高速化するために、重要な時間を費やすターゲットを非同期ターゲットでラップする必要があります。非同期ロギングは非常に一般的なシナリオであるため、NLogはすべてのターゲットをAsyncWrapperでラップするための省略表記をサポートしています。設定ファイルの要素にasync = "true"を追加するだけです。 ...あなたの目標はここに行きます...

非同期ロギングを使用すると、特定のメッセージが破棄される可能性があることに注意してください。これは 設計による です。


ref: https://github.com/nlog/NLog/wiki/AsyncWrapper-target#async-attribute-and-asyncwrapper

Async属性とAsyncWrapper

Async属性とAsyncWrapperを組み合わせないでください。これは処理を遅くするだけであり、信頼性のない動作をします。

非同期属性はデフォルトで破棄されます

Async属性は以下の略記です。

xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"

85
Eric

このオーバーヘッドを失う必要があり、コードで構成している人にとっては、デフォルトですべてのターゲットを非同期に設定できるようには見えません。ターゲットごとに定義する必要があります。

// Set up asynchronous database logging assuming dbTarget is your existing target
AsyncTargetWrapper asyncWrapper = new AsyncTargetWrapper(dbTarget);
config.AddTarget("async", asyncWrapper);

// Define rules
LoggingRule rule1 = new LoggingRule("*", LogLevel.Trace, asyncWrapper);
config.LoggingRules.Add(rule1);

キューに入れすぎるログアイテムが多すぎると、デフォルトでアイテムがドロップされるので注意してください。OverflowAction = AsyncTargetWrapperOverflowAction.Block同期動作に戻ります。

19
Rob Church