当 .Net Thread 没有名称时,如何使用 NLog 打印 threadid 而不是 threadname?

Man*_*gor 3 .net c# logging multithreading nlog

我有如下 NLog 配置。

如果存在,它会打印线程的名称。否则我会得到空字符串而不是线程名称。

问题:我如何归档下面的行为?

  • 如果线程有名称 - 打印线程名称
  • 否则 - 打印 ManagedThreadId(例如与threadidNLog 变量相同)。

当前配置示例:

<variable name="defaultLayout" value="${date} ${level} [${threadname}] ${logger} - ${message} ${exception:format=ToString}"/>

<targets async="true">
  <target name="ConsoleAppender" 
          type="ColoredConsole" 
          layout="${var:defaultLayout}" />
</targets>
Run Code Online (Sandbox Code Playgroud)

请注意:我想避免打印这两个变量,例如这种没有用的布局: ... [${threadname}-${threadid}] ...

Man*_*gor 5

TLDR:使用这个 - ${threadname:whenEmpty=${threadid}}

所以正确的配置:

<variable name="defaultLayout" value="${date} ${level} [${threadname:whenEmpty=${threadid}}] ${logger} - ${message} ${exception:format=ToString}"/>

<targets async="true">
   <target name="ConsoleAppender" 
      type="ColoredConsole" 
      layout="${var:defaultLayout}" />
</targets>
Run Code Online (Sandbox Code Playgroud)