使用nlog记录多个线程

问题描述 投票:2回答:1

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

是否有解决此问题的干净方法?

c# multithreading logging nlog
1个回答
11
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.