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”的方法。有人有主意吗?

+0

[考虑NLog](https://github.com/nlog/nlog/wiki/Layout-RendererNets) –

+0

也许你可以创建一个自定义记录器包装并手动添加ThreadID? 看看这个链接: https://logging.apache.org/log4net/release/example-apps.html 这里讨论了如何使用自定义EventID(以前使用它自己)来扩展log4net。我想你可以使用这个方法来添加ThreadID而不是EventID。 –

+0

就好像我需要一个自定义的'ConversionPattern' – Denis

在您的应用程序线程使用:

ThreadContext.Properties["threadid"] = Thread.CurrentThread.ManagedThreadId; 
在转换模式

%property{threadid} 

这可能是手动添加ThreadContext.Property,像@沃特的回答是不可能的外面。

在这里看到的文档:

PatternLayout Class

线|用于输出生成记录事件的线程的名称。如果没有名称可用,则使用线程号。

因此,如果线程名称不存在,您只能获得线程ID。我自己对此感到沮丧,因为我只想要线程ID,即使线程已被命名。