NLog 如何在不同场景下使用不同 JSON 布局格式将消息记录到控制台

NLog how to log messages to console with different JSON layout formats in different scenarios

我们正在使用 NLog。我们需要在不同的场景中使用不同的 JSON 格式将消息记录到控制台。

Ex: 如果发生异常 下面是格式

{
            “id”:”5656”,
            “uuid”:”xdd895-65454”,
            “key”:”somekeyname”,
            “message”: “** exception message **”,
            “stack_trace”: “”**exception stack trace**”
}

如果日志消息正常

{
            "id":"8898998"
            “messge”: “Time taken to retrieve data from database”
            “Time”: “1100” (in milli seconds)
}

像这样我们有10个场景。

方法一: 我尝试在 nlog 部分的 web.config 文件中创建不同的目标,如下所示

 <target xsi:type="Console" name="console_exception" >
    <layout xsi:type="JsonLayout">
      <attribute name="id" layout="${mdlc:itemid}" />
      <attribute name="uuid" layout="${mdlc:item=uuid}" />
      <attribute name="loglevel" layout="${level}" />
      <attribute name="timestamp" layout="${date}" />
      <attribute name="message" layout="${message}" />
    </layout>
  </target>
  <target xsi:type="Console" name="console_databaseTimeTaken" >
    <layout xsi:type="JsonLayout">
      <attribute name="id" layout="${mdlc:item=id}" />
      <attribute name ="custommessage" layout="Time taken to retrieve data from database"/>
      <attribute name="timestamp" layout="${date}" />
      <attribute name="message" layout="${message}" />
    </layout>
  </target>
  <rules>
  <logger name="*" minLevel="Trace" writeTo ="console"/>
</rules>

我不知道如何以编程方式设置目标和布局。 到目前为止,我已经找到了基于条件的日志记录,但这不是一个好方法。

方法二: 记录消息时,我们根据需要手动格式化字符串消息,然后调用日志方法

string logmessag= string.Format("\"id\":\"{0}\",\"messge\": {1}\"\",\"Time\": \"{2}(in milli seconds)\"", id, message, time);

使用的技术:Webapi2、Nlog 4.0.3 IDE:VS2017 让我们知道解决这个问题的最佳方法 提前致谢

您需要使用过滤器,可以直接在 <logger> 元素上使用,也可以在允许更复杂条件的子元素 <filters> config element 上使用。

例如。 (假设您可以使用记录器的名称):

<rules>
  <logger name='DB' minLevel="Trace" writeTo="console_databaseTimeTaken" final="true" />
  <logger name='Error' minLevel="Trace" writeTo="console_exception" final="true" />
  …
</rules>

<filter> elements allow more flexibility, but are still fairly limited. Ultimately you can extend NLog with custom conditions.