当前位置: 首页 > 编程语言 > C#

NLogFileTargetwrappedwithBufferingTargetWrappercannotwritetologiftherearedelayShare

时间:2023-04-10 15:43:17 C#

NLogFileTargetwrappedwithBufferingTargetWrappercannotwritetologiftheredelay检查这里的答案:为了重现问题,我克隆了NLog源,所以我可以添加延迟来解决问题。在visualstudio中打开后,我添加了一个控制台应用程序,该应用程序引用了NLog源项目并进行了一些非常简单的日志记录调用。NLog.config如下:到目前为止,一切都按预期进行。下一步是在FileTarget的刷新逻辑中插入延迟。(我发现这个问题的原因是我原来使用的MailTarget在连接到邮件服务器时会挂起一段时间-我已经用FileTarget替换了它,不容易重现问题)。打开FileTarget.cs并找到Write(AsyncLogEventInfo[]logEvents)方法。在第一行插入Thread.Sleep(5000),使方法看起来像这样:protectedoverridevoidWrite(AsyncLogEventInfo[]logEvents){Thread.Sleep(5000);//...省略}现在,编译并重新运行。日志不写。据我所知,当进程退出时刷新所有目标的逻辑使用默认超时为15秒的异步方法调用,这可以在LogFactory.csFlush()方法中找到-显然没有超过。但是,NLog使用ThreadPool.QueueUserWorkItem()(在AsyncHelpers.cs中找到)来并行编排每个目标的刷新。这归结为一个问题,这种形式的方法调用如何响应对Thread.Sleep()的调用或任何其他形式的阻塞(例如连接到远程服务器,如我最初的问题)?有任何想法吗?我终于弄明白为什么什么都没有被记录,可悲的是,没有什么可做的。根据AppDomain.ProcessExit的MSDN文档,这是NLog处理的事件:所有ProcessExit事件处理程序的总执行时间是有限的,就像所有终结器的总执行时间在进程关闭时是有限的一样。默认值为两秒。非托管主机可以通过使用OPR_ProcessExit枚举值调用ICLRPolicyManager::SetTimeout方法来更改此执行时间。因此,从托管代码处理此问题的唯一方法似乎是在允许应用程序退出之前手动调用LogManager.Flush()。以上是C#学习教程:如果有延迟的话,用BufferingTargetWrapper封装的NLogFileTarget写不出日志分享的所有内容。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——本文来自网络合集,不代表立场,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢