【问题标题】:Logging multiple threads with nlog使用 nlog 记录多个线程
【发布时间】:2016-05-09 23:17:49
【问题描述】:

我在我的项目中使用 nlog 记录器。

我的程序根据我从 sql server 获取的数据生成 xml 文件。我正在使用 PLINQ 执行此操作。但我还必须记录跟踪信息,以便能够对生产环境中的异常情况进行一些调查。

结果日志看起来很糟糕,当它来自多个线程时。例如:

Operation 1 started
Deserializing XXX
Operation 2 started
Deserializing XXX finished with status X
Filling XXX with data from Z
Deserializing YYY....

它只是为了并行度2。

我希望看到这样的结果:

Operation 1 started
Deserializing XXX
Deserializing XXX finished with status X
Filling XXX with data from Z
Operation 1 finished
Operation 2 started    
Deserializing YYY....

我看到了一些解决方案,但它们看起来不够好:

  1. 将日志记录数据保存到某个缓冲区并在并行任务结束时刷新它 - 我应该将上下文传递给所有内部方法(看起来很糟糕!)。

  2. 为日志消息添加某种前缀以帮助获取某些消息的上下文 - 我必须将前缀传递给每条内部消息(看起来也很糟糕)。

这个问题有一些干净的解决方案吗?

【问题讨论】:

  • 我认为按照事件的实际顺序记录日志实际上可能对错误检测很有价值,因为多线程环境中的典型错误当然是一些未预料到的事件顺序。但是为什么不在日志消息前加上线程名/ID呢?日志可以通过线程中的接口进行引导(无论如何这是一个好主意),可以将前缀添加到实际消息中。这样您就可以随时对日志进行后处理,以便一起查看与特定线程相关的所有消息。
  • 我认为缓冲是一种值得怀疑的日志策略,因为导致灾难性错误的事件可能永远不会写入日志。
  • 你能把所有的日志写入一个并发队列,然后在另一个线程上出列吗?
  • 其独立的 xml 填充过程 - 所以在这种特殊情况下我不必保存订购。但它具有非常复杂的域逻辑 - 所以我必须在特定线程中保存顺序,因为通过来自许多不同线程的大量日志进行调查对我来说将是一场噩梦。是的,我可以使用 ThreadId,但我必须使用一些过滤来分组和排序 btw
  • @Enigmativity 看起来很有趣,你能详细描述一下吗?

标签: c# multithreading logging nlog


【解决方案1】:

在 NLog 配置文件中,有 ${threadid} 语法。像这样使用它:

<target name="file" xsi:type="File"
     layout="${longdate} [${threadid}] ${level:uppercase=true} ${message} ${exception:format=tostring}"
     fileName="${basedir}/logs/log.txt"
     archiveFileName="${basedir}/logs/log.{#####}.txt"
     archiveAboveSize="10485760"
     archiveNumbering="Sequence"
     concurrentWrites="true"
     keepFileOpen="false" />

更多信息:
https://github.com/NLog/NLog/wiki/ThreadId-Layout-Renderer

我在生产中使用它并且通常它可以工作。它并不完美,但所有操作(我记录的)都是按顺序排列的,这个threadid 描述了哪个操作在哪个 ThreadId 中。

【讨论】:

  • 它的解决方案简单干净,但需要添加一些过滤和排序工具。如果没有额外的文本处理,很多与 id 混合的内容都无法提供帮助。我正在考虑将此变体保留为:)
  • 您想创建一个不错的查看器来记录文件吗?它是另一层,有很多工具可以做到这一点。
  • 我的问题是避免它。
  • threadid 是 int 类型的,对于那些想知道的人来说。 github.com/jpdillingham/NLog.RealtimeLogger
猜你喜欢
  • 1970-01-01
  • 2011-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
相关资源
最近更新 更多