ロギングで予想されるオーバーヘッドは何ですか?私はこの例を試しました
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>
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属性は以下の略記です。
xsi:type="AsyncWrapper overflowAction="Discard" queueLimit="10000" batchSize="100" timeToSleepBetweenBatches="50"
このオーバーヘッドを失う必要があり、コードで構成している人にとっては、デフォルトですべてのターゲットを非同期に設定できるようには見えません。ターゲットごとに定義する必要があります。
// 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
同期動作に戻ります。