【发布时间】: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....
我看到了一些解决方案,但它们看起来不够好:
将日志记录数据保存到某个缓冲区并在并行任务结束时刷新它 - 我应该将上下文传递给所有内部方法(看起来很糟糕!)。
为日志消息添加某种前缀以帮助获取某些消息的上下文 - 我必须将前缀传递给每条内部消息(看起来也很糟糕)。
这个问题有一些干净的解决方案吗?
【问题讨论】:
-
我认为按照事件的实际顺序记录日志实际上可能对错误检测很有价值,因为多线程环境中的典型错误当然是一些未预料到的事件顺序。但是为什么不在日志消息前加上线程名/ID呢?日志可以通过线程中的接口进行引导(无论如何这是一个好主意),可以将前缀添加到实际消息中。这样您就可以随时对日志进行后处理,以便一起查看与特定线程相关的所有消息。
-
我认为缓冲是一种值得怀疑的日志策略,因为导致灾难性错误的事件可能永远不会写入日志。
-
你能把所有的日志写入一个并发队列,然后在另一个线程上出列吗?
-
其独立的 xml 填充过程 - 所以在这种特殊情况下我不必保存订购。但它具有非常复杂的域逻辑 - 所以我必须在特定线程中保存顺序,因为通过来自许多不同线程的大量日志进行调查对我来说将是一场噩梦。是的,我可以使用 ThreadId,但我必须使用一些过滤来分组和排序 btw
-
@Enigmativity 看起来很有趣,你能详细描述一下吗?
标签: c# multithreading logging nlog