使用 nlog 记录多个线程
Logging multiple threads with nlog
我在我的项目中使用了nlog记录器。
我的程序根据我从 sql 服务器获得的数据生成 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....
我看到了一些解决方案,但它们看起来不够好:
将日志记录数据保存到某个缓冲区并在并行任务结束时将其刷新 - 我应该将上下文传递给所有内部方法(看起来很糟糕!)。
向日志消息添加某种前缀以帮助获取某些消息的上下文 - 我必须将前缀传递给每个内部消息(看起来也很糟糕)。
这个问题有一些干净的解决方案吗?
在 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 中。
我在我的项目中使用了nlog记录器。
我的程序根据我从 sql 服务器获得的数据生成 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....
我看到了一些解决方案,但它们看起来不够好:
将日志记录数据保存到某个缓冲区并在并行任务结束时将其刷新 - 我应该将上下文传递给所有内部方法(看起来很糟糕!)。
向日志消息添加某种前缀以帮助获取某些消息的上下文 - 我必须将前缀传递给每个内部消息(看起来也很糟糕)。
这个问题有一些干净的解决方案吗?
在 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 中。