c# - 当调用 Flush() 时,NLog 是否应该刷新 AsyncTargetWrapper 中所有排队的消息?

标签 c# silverlight nlog

我想关闭我的应用程序并写入任何待处理的日志消息。所以我在关机过程中调用了 LogManager.Flush()。但是,我没有看到所有的消息都写出来了。相反,如果我等待几秒钟(使用 Thread.Sleep()),我会看到消息。

检查后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;
    }

最佳答案

ligos的评论是在正确的轨道上。 AsyncTargetWrapper.CloseTarget() 方法因 NLog issue 134 而被修改,其中嵌套的 BufferingTargetWrapper 没有在域卸载时刷新。

LogManager.Shutdown() 确实强制 AsyncTargetWrapper 有效同步刷新,但它必须在 LogManager.Flush() 之后使用> 因为诸如 BufferingTargetWrapper 之类的目标实际上不会在关闭时刷新。设置 LogManager.Configuration = null 可能会更好,因为这会执行刷新,然后一次关闭目标,下次需要使用时将重新加载配置(如果使用配置文件) .

我已经测试了两者,我选择了后者,因为我希望在我把事情做好后恢复并运行我的日志记录,但鉴于问题是在 Silverlight 中,我建议:

LogManager.Flush();
LogManager.Shutdown();

编辑

LogManager 在域卸载或进程退出时将配置设置为空,因此除非运行旧的 NLog 版本,否则我们不应该看到此问题。 NLog 问题已于 2012 年 10 月修复。在没有明确关闭或将配置设置为 null 的情况下进行了测试,可以确认调用 LogManager.Flush() 就足够了。

关于c# - 当调用 Flush() 时,NLog 是否应该刷新 AsyncTargetWrapper 中所有排队的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10492720/

相关文章:

C#无限迭代

c# - 这怎么不会在Silverlight中引起跨线程异常?

silverlight - 在Silverlight中如何发现Color为空?

c# - 如何使用 DotNetZip 即时提取 ZIP 文件?

c# - 有什么好的方法可以找到应用程序中的瓶颈吗?

c# - MVVM 模型到 ViewModel 的通信

NLog:ObjectReflectionCache类总是初始化一个容量巨大的MruCache对象

azure - 添加对 Azure Blob 存储的 nlog 支持后,Xamarin 版本构建失败

c# - 如何集成 NLog 将日志写入 Azure Streaming 日志

c# - 除了强制转换 IntPtr 来增加它之外,还有其他方法吗?