Log4Net在日志中打印“ThreadID”和“Thread Name”

时间:2017-03-08 15:13:49

标签: c# .net vb.net log4net

在我们的应用中,我们通常命名我们创建的线程。例如,我们将创建一个线程并为其命名,如“WorkerThread”。

假设这是我的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”的方法。有人有什么想法吗?

2 个答案:

答案 0 :(得分:3)

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

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

%property{threadid}

答案 1 :(得分:3)

在手动添加ThreadContext.Property之外可能是不可能的,就像在@Wouter的回答中一样。

请参阅此处的文档:

PatternLayout Class

  

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

因此,如果线程名称不存在,则只获取线程ID。我自己也很沮丧,因为我只想要线程ID,即使线程被命名。