在 NLog 使用 AsyncWrapper 后大部分日志丢失

Posted

技术标签:

【中文标题】在 NLog 使用 AsyncWrapper 后大部分日志丢失【英文标题】:Most of the log missing after using AsyncWrapper at NLog 【发布时间】:2018-06-24 19:38:31 【问题描述】:

我正在使用 NLog 同步 日志记录,它写入了我所有的日志消息,但执行起来需要更多时间。所以,我期待异步日志。但是在实现异步日志之后,当每秒日志超过 300 时,许多日志会丢失。但我的要求是每秒写入超过 2000 个日志。

我在 NLog 配置下面使用这个:

  <targets>
    <target name="asyncViewer" xsi:type="AsyncWrapper" overflowAction="Block" queueLimit="1000000" batchSize="1000" timeToSleepBetweenBatches="0">
      <target xsi:type="Chainsaw" name="viewer" address="udp://127.0.0.1:9999">
        <parameter name="exception" layout="$exception:format=Type,Message,StackTrace:separator=&#13;&#10;" />
      </target>
    </target>

  </targets>

我该如何解决这个问题? 给我任何建议。 提前致谢。

【问题讨论】:

启用内部记录器时的任何警告或错误 -> github.com/NLog/NLog/wiki/Internal-Logging ?? 未显示警告或错误。 您已从问题中排除了日志记录规则,您可以添加这些吗?请记住,它们都必须映射到 asyncViewer-target 而不是包装的 viewer-target。 你用的是什么版本的 NLog? 您是否尝试将 asyncViewer-target 的 batchSize 降低到 10 或 50 ? (或者也许只有 1 个用于测试) 【参考方案1】:

您使用什么 logviewer-application 来查看 Chainsaw-target 的输出?您是否尝试过使用 TCP 而不是 UDP?

也许 logviewer-application 无法处理 UDP 包,需要一些帮助来通过添加 newline="true" 来拆分 LogEvents:

  <targets>
    <target name="asyncViewer" xsi:type="AsyncWrapper" overflowAction="Block" queueLimit="1000000" batchSize="1000" timeToSleepBetweenBatches="0">
      <target xsi:type="Chainsaw" name="viewer" address="udp://127.0.0.1:9999" newline="true">
        <parameter name="exception" layout="$exception:format=Type,Message,StackTrace:separator=&#13;&#10;" />
      </target>
    </target>
  </targets>

另见https://github.com/NLog/NLog/issues/2145

【讨论】:

以上是关于在 NLog 使用 AsyncWrapper 后大部分日志丢失的主要内容,如果未能解决你的问题,请参考以下文章

调用 close() 后大文件没有立即刷新到磁盘?

由多个电容组成的去耦旁路电路,电容怎么布局摆放,先大后小还是先小后大?

408数据结构与算法—冒泡排序(十八)

408数据结构与算法—冒泡排序(十八)

[答疑]一个货车有四个轮子,两小前轮,两后大轮

NLog的介绍使用