【问题标题】:How to print threadid instead of threadname by using NLog when .Net Thread does not have name?当.Net Thread没有名称时,如何使用NLog打印threadid而不是threadname?
【发布时间】:2019-07-20 05:03:11
【问题描述】:

我有如下的 NLog 配置。

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

问题:如何归档以下行为?

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

当前配置示例:

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

<targets async="true">
  <target name="ConsoleAppender" 
          type="ColoredConsole" 
          layout="${var:defaultLayout}" />
</targets>

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

【问题讨论】:

  • 如果您可以同时记录线程 ID 和线程名称(如果有),您可以简单地定义自己的布局... (nlog-project.org/config/?tab=layout-renderers)
  • @elgonzo,我同意。但是我只想从上面写一个变量。会注意到这一点,谢谢。
  • 仅供参考:如果您真的想仅在不存在线程名称的情况下输出线程 ID,请确保您不会在日志中混淆两者。毕竟,某个线程可能被命名为“123”,而另一个(未命名)线程的线程 ID 可能是 123...
  • 我不确定,但也许可以使用条件布局渲染器之一 ${When} 或 ${WhenEmpty}...
  • @elgonzo,当然可以。我们的大多数线程都有漂亮的名称,例如“XXX Object Loader”或“YYY Data Publisher”。我们希望在日志中包含这些名称并避免添加线程标识。你是对的,在这种情况下,id 为 123 的线程将以与名称为“123”的线程相同的方式打印。关于 ${WhenEmpty} - 同意,将检查并发布结果。

标签: c# .net multithreading logging nlog


【解决方案1】:

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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-31
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    相关资源
    最近更新 更多