使用Nlog并将文件写为json

时间:2014-11-11 20:33:51

标签: json nlog

我想我错过了一些东西,因为我似乎无法弄清楚如何使用配置文件中的NLog设置将其写入json格式的日志文件。直接滚动文件工作正常,但不是json。 json目标只输出消息(不是在json中)。

<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">        
    <targets async="true">
      <target xsi:type="File" name="rollingFile" fileName="${basedir}/logs/${shortdate}.log" archiveFileName="${basedir}/logs/{shortdate}_Archive{###}.log" archiveAboveSize="1000000" archiveNumbering="Sequence" layout="${longdate} ${uppercase:${level}} ${callsite} ${message}" />
      <target xsi:type="File" 
              name="rollingFileJson" 
              fileName="${basedir}/logs/${shortdate}.json" 
              archiveFileName="${basedir}/logs/{shortdate}_Archive{###}.json" 
              archiveAboveSize="1000000" 
              archiveNumbering="Sequence" 
              layout="${json-encode} ${message}">
      </target>

    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="rollingFile" />
      <logger name="*" minlevel="Trace" writeTo="rollingFileJson" />
    </rules>
  </nlog>

2 个答案:

答案 0 :(得分:11)

自NLog 4.0.0发布以来,可以使用将事件呈现为结构化JSON文档的布局。

取自NLog project site

的示例
<target name="jsonFile" xsi:type="File" fileName="${logFileNamePrefix}.json">
    <layout xsi:type="JsonLayout">
        <attribute name="time" layout="${longdate}" />
        <attribute name="level" layout="${level:upperCase=true}"/>
        <attribute name="message" layout="${message}" />
    </layout>
</target>

修改 您也可以在代码中创建它。

Here是指向文档特定部分的链接。

这里是复制的例子:

var jsonLayout = new JsonLayout
{
    Attributes =
    {
        new JsonAttribute("type", "${exception:format=Type}"),
        new JsonAttribute("message", "${exception:format=Message}"),
        new JsonAttribute("innerException", new JsonLayout
        {

            Attributes =
            {
                new JsonAttribute("type", "${exception:format=:innerFormat=Type:MaxInnerExceptionLevel=1:InnerExceptionSeparator=}"),
                new JsonAttribute("message", "${exception:format=:innerFormat=Message:MaxInnerExceptionLevel=1:InnerExceptionSeparator=}"),
            }
        },
        //don't escape layout
        false)
    }
};

有关详细信息,请阅读docs

答案 1 :(得分:2)

根据NLog documentation json-encode 只会使用JSON规则转义输出其他布局。它不会将输出“转换”为JSON。你必须自己做。

'{ "date":"${longdate}","level":"${level}","message":${message}}'

请查看this question了解详情。