Tag: 池nlog

如果存在延迟,使用BufferingTargetWrapper包装的NLog FileTarget无法写入日志

我可能偶然发现了NLog的一个问题,但我想先在这里查一下答案: 为了重新创建问题,我克隆了NLog源,因此我可以添加延迟来解决问题。 在visual studio中打开后,我添加了一个引用NLog源项目的控制台应用程序,并进行了一些非常简单的日志调用。 NLog.config如下: 到目前为止,所有工作都按预期进行。 下一步是在FileTarget的刷新逻辑中插入一个延迟。 (我发现这个问题的原因是我最初使用的MailTarget在连接到邮件服务器时会挂起一段时间 – 我已经将其替换为FileTarget ,而不是更容易重新创建问题)。 打开FileTarget.cs并找到Write(AsyncLogEventInfo[] logEvents)方法。 在第一行Thread.Sleep(5000)插入,以便方法如下所示: protected override void Write(AsyncLogEventInfo[] logEvents) { Thread.Sleep(5000); // … omitted } 现在,编译并重新运行。 日志没有写入。 据我所知,当进程退出时刷新所有目标的逻辑使用一个异步方法调用,默认超时为15秒,可以在LogFactory.cs Flush()方法中找到 – 显然没有超过。 但是,NLog使用ThreadPool.QueueUserWorkItem() (在AsyncHelpers.cs中找到)来并行编排每个目标的刷新。 这可以归结为一个问题,即这种forms的方法调用如何对Thread.Sleep()的调用或任何其他forms的阻塞(例如连接到远程服务器,如我原来的问题)做出反应? 有任何想法吗?