アプリケーションをシャットダウンし、保留中のログメッセージを書き込みたいとします。だから私はLogManager.Flush()
私のシャットダウンプロセス中に呼び出します。しかし、私は書き出されたすべてのメッセージは表示されません。代わりに、私が(Thread.Sleep()
を使用して)数秒待つと、メッセージが表示されます。Flush()が呼び出されたときにNLogがAsyncTargetWrapperのすべてのキューに入れられたメッセージをフラッシュしますか?
NLog's code on GitHUBを調べた後、AsyncTargetWrapper.FlushAsync()
メソッドは、レイジーライタースレッドが次のバッチですべてのペンディングメッセージを書き込むようにスケジューリングするだけです。ログメッセージを同期的に書き込んでいません。
これは予期された動作ですか?私は、LogManager.Flush()
が同期することを期待しています。すなわち、保留中のすべてのメッセージが書き込まれるまで(またはタイムアウトが超過するまで)ブロックします。
私はシャットダウン時に使うコード:
LogManager.Flush(ex => { }, TimeSpan.FromSeconds(15));
そしてNlogを初期化するためのコード(これはSilverlightのアプリですので、私はすべての設定ファイルを使用していません)。
public static void InitialiseNLog(LogLevel forLevel)
{
var config = new LoggingConfiguration();
// Add targets.
// We need an async target wrapping a custom web service call back to the server.
var serverTarget = new RemoteServiceTarget();
var asyncWrapper = new AsyncTargetWrapper(serverTarget, 10000, AsyncTargetWrapperOverflowAction.Discard);
asyncWrapper.TimeToSleepBetweenBatches = (int)TimeSpan.FromSeconds(2).TotalMilliseconds;
asyncWrapper.BatchSize = 200;
// Add rules.
var rule = new LoggingRule("Company.Application.SilverlightApp.*", forLevel, asyncWrapper);
config.LoggingRules.Add(rule);
// Activate the configuration.
LogManager.Configuration = config;
LogManager.GlobalThreshold = forLevel;
}
。 –
これはちょっと古いので、全体の文脈を覚えていません。しかし、シャットダウン時に 'Thread.Sleep()'を呼び出す方が良い方法にはなりません。現在のNLogには 'LogManager.Shutdown()'メソッドがありますが、これは(テストしていませんが)より良い選択肢かもしれません。 – ligos