アプリケーションをシャットダウンし、保留中のログ メッセージを書き込みたいです。LogManager.Flush()
そのため、シャットダウンプロセス中に呼び出します。ただし、すべてのメッセージが書き出されているわけではありません。代わりに、( を使用して) 数秒間待つとThread.Sleep()
、メッセージが表示されます。
GitHUB でNLog のコードを調べたところ、この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;
}