Log4Net在日志中打印“ThreadID”和“Thread Name”
问题描述:
在我们的应用程序中,我们通常会命名我们创建的线程。例如,我们将创建一个线程并为其命名为“WorkerThread”。Log4Net在日志中打印“ThreadID”和“Thread Name”
比方说,这是我的log4net的配置文件的一部分:
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="C:\Logs\MyApp\myapp.log" />
<param name="AppendToFile" value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="1000MB" />
<staticLogFileName value="true" />
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="FATAL" />
</filter>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c :: %m%n" />
</layout>
</appender>
该配置将打印在我的日志如下:
2017-03-07 17:00:00,003 [MessagePump Worker] DEBUG MyApp.App :: Blah Blah Blah
我会把它想打印:
2017-03-07 17:00:00,003 [MessagePump Worker: 2380] DEBUG MyApp.App :: Blah Blah Blah
我只是想弄清楚我需要把我的转换模式,以包括ThreadID (2380),就像我上面的例子。我做了一些谷歌搜索,但我似乎无法找到打印“线程名称”和“线程ID”的方法。有人有主意吗?
答
在您的应用程序线程使用:
ThreadContext.Properties["threadid"] = Thread.CurrentThread.ManagedThreadId;
在转换模式
:
%property{threadid}
答
这可能是手动添加ThreadContext.Property,像@沃特的回答是不可能的外面。
在这里看到的文档:
线|用于输出生成记录事件的线程的名称。如果没有名称可用,则使用线程号。
因此,如果线程名称不存在,您只能获得线程ID。我自己对此感到沮丧,因为我只想要线程ID,即使线程已被命名。
[考虑NLog](https://github.com/nlog/nlog/wiki/Layout-RendererNets) –
也许你可以创建一个自定义记录器包装并手动添加ThreadID? 看看这个链接: https://logging.apache.org/log4net/release/example-apps.html 这里讨论了如何使用自定义EventID(以前使用它自己)来扩展log4net。我想你可以使用这个方法来添加ThreadID而不是EventID。 –
就好像我需要一个自定义的'ConversionPattern' – Denis