c# - 使用 nlog 记录多个线程

标签 c# multithreading logging nlog

我在我的项目中使用了 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. 向日志消息添加某种前缀以帮助获取某些消息的上下文 - 我必须将前缀传递给每个内部消息(看起来也很糟糕)。

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

最佳答案

在 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 中。

关于c# - 使用 nlog 记录多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35131659/

相关文章:

c++ - 如何在多线程 C++ 中实现 "soft barrier"

java - 如何在运行时以编程方式添加 Log4J2 附加程序?

java - 有没有一种方法可以在不反射的情况下从不同的运行时包访问 protected 类成员?

c# - .NET 引用(未找到方法)

c# - 将字符串拆分为 List<int> 忽略无 int 值

Java项目在windows和linux下显示不同进程数

c# - 任务重复?

c# - 在 foreach 循环中使用 predicatebuilder 时遇到问题

c# - 从表达式中的集合访问嵌套属性

java - 如何将堆栈跟踪错误放入记录器中