使用Nlog并将日志写入文件作为JSON格式

9

我认为我缺少了一些东西,因为我似乎无法弄清楚如何使用在配置文件中设置的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个回答

16

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

以下示例摘自NLog项目网站

<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>

编辑: 你也可以使用代码创建它。

这里是具体文档的链接。

以下是复制的示例:

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)
    }
};

如需更多信息,请阅读文档


有没有以编程方式完成这个的方法? - user3841581
@user3841581 在代码中添加了一个从文档中提取的示例来完成它。 - Chrono

3
根据NLog文档,json-encode只会使用JSON规则来转义其他布局的输出。它不会将输出“转换”为JSON。这需要您自己完成。
'{ "date":"${longdate}","level":"${level}","message":${message}}'

查看此问题以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接