【问题标题】:How can I log the CorrelationManager.ActivityId with NLog如何使用 NLog 记录 CorrelationManager.ActivityId
【发布时间】:2014-06-12 09:05:06
【问题描述】:

如何将CorrelationManager.ActivityId 记录为单独的字段?

这是我当前的 NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <variable name="logDirectory" value="${basedir}/Logs" />

  <extensions>
    <add assembly="NLog.Mongo"/>
  </extensions>

  <targets>
    <target xsi:type="Mongo"
            name="mongoCustom"
            includeDefaults="false"
            connectionString="mongodb://localhost/FooLogging"
            collectionName="authLogs">

      <field name="Date" layout="${longdate:universalTime=true}" />
      <field name="Level" layout="${level}"/>
      <field name="Message" layout="${message}" />
      <field name="Logger" layout="${logger}"/>
      <field name="Exception" layout="${exception:format=tostring}" />
      <field name="ThreadID" layout="${threadid}" />
      <field name="ThreadName" layout="${threadname}" />
      <field name="ProcessID" layout="${processid}" />
      <field name="ProcessName" layout="${processname:fullName=true}" />
      <field name="UserName" layout="${windows-identity}" />
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Trace" writeTo="mongoCustom" />
  </rules>
</nlog>

【问题讨论】:

    标签: .net logging nlog trace


    【解决方案1】:

    ${activityid} 是在 NLog v4.1 中添加的。 https://github.com/nlog/nlog/wiki/Trace-Activity-Id-Layout-Renderer

    【讨论】:

      【解决方案2】:

      目前没有对CorrelationManager.ActivityId的内置支持。

      但是您可以创建自己的布局渲染来输出它:

      [LayoutRenderer("activityid")]
      public class ActivityIdLayoutRenderer : LayoutRenderer
      {
          protected override void Append(StringBuilder builder, LogEventInfo logEvent)
          {
              builder.Append(Trace.CorrelationManager.ActivityId.ToString());
          }
      }
      

      您还需要注册:

       ConfigurationItemFactory.Default.LayoutRenderers
            .RegisterDefinition("activityid", typeof(ActivityIdLayoutRenderer));
      

      然后你可以在你的目标定义中使用它:

      <target xsi:type="Mongo">
            <!-- ... -->
            <field name="ActivityId" layout="${activityid}" />
      </target>
      

      作为替代解决方案,您也可以使用Event Context Layout Renderer 来输出任何自定义属性,例如 ActivityId,但在这种情况下,您必须在每次记录某些内容时都包含它。

      【讨论】:

      • 谢谢!我也提出了一个问题:github.com/NLog/NLog/issues/332
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2013-10-09
      • 1970-01-01
      • 2016-05-09
      相关资源
      最近更新 更多