C# “Log4Net打印”;ThreadID";及;“线程名称”;日志中

C# “Log4Net打印”;ThreadID";及;“线程名称”;日志中,c#,.net,vb.net,log4net,C#,.net,Vb.net,Log4net,在我们的应用程序中,我们通常命名我们创建的线程。例如,我们将创建一个线程,并为其命名为“WorkerThread” 假设这是我的log4net配置文件的一部分: <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="C:\Logs\MyApp\myapp.log" /> <p

在我们的应用程序中,我们通常命名我们创建的线程。例如,我们将创建一个线程,并为其命名为“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: 2380] DEBUG MyApp.App :: Blah Blah Blah

我只是想弄清楚我需要在转换模式中加入什么,才能像上面的例子一样包含ThreadID(2380)。我做了一些谷歌搜索,但我似乎找不到一种方法来打印“线程名称”和“线程ID”。有人有什么想法吗?

在应用程序线程中使用:

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

%property{threadid}

除了手动添加ThreadContext.Property之外,这可能是不可能的,就像@Wouter的回答一样

请参阅此处的文档:

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


因此,只有当线程名称不存在时,才能获得线程id。我自己对此很失望,因为我只需要线程ID,即使在命名线程时也是如此。

也许您可以创建一个自定义记录器包装器并手动添加线程ID?看看这个链接:这里讨论了如何使用定制的EventID扩展log4net(我以前也使用过)。我认为您可以使用此方法添加ThreadID而不是EventID。这就好像我需要一个自定义的
转换模式
@HansPassant-如果这是从log4net切换到NLOGID的唯一原因,那么对管理层来说,这将是一个艰难的任务。您尝试使用%thread来代替吗?
%property{threadid}