我想关闭我的应用程序并写入任何待处理的日志消息。所以我LogManager.Flush()
在关机过程中打电话。但是,我没有看到所有写出的消息。相反,如果我等待几秒钟(使用Thread.Sleep()
),我会看到这些消息。
在检查了 NLog 在 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;
}