You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NLog输出的每个JSON日志文档后添加逗号?

如何在NLog的每条JSON日志后添加逗号?

需要实现的效果是每条JSON日志条目后单独一行添加逗号,示例如下:

{ "time": "2022-10-12", "name": "Index", "level": "ERROR", "message": "Hello Logging" }

,

{ "time": "2022-10-12", "name": "Index", "level": "ERROR", "message": "Hello Logging" }

当前配置的问题在于:FileTarget中不能直接定义多个<layout>节点,第二个Layout会被NLog忽略,所以无法实现预期的逗号添加效果。

正确实现方法

方法一:使用CompositeLayout组合布局

通过CompositeLayout将JSON布局和逗号文本布局组合在一起,确保JSON日志输出后紧跟换行和逗号:

<?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"
      autoReload="true"
      internalLogLevel="Error"
      internalLogFile="c:\\LogFiles\TasksInternalLog.txt">

    <!-- 启用ASP.NET Core布局渲染器 -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <targets>
        <target xsi:type="File" name="tasksJsonFile" fileName="c:\\logFiles\\json-${shortdate}.log">
            <!-- 组合JSON布局和逗号布局 -->
            <layout xsi:type="CompositeLayout">
                <!-- 输出JSON日志内容 -->
                <layout xsi:type="JsonLayout" includeAllProperties="false">
                    <attribute name="time" layout="${longdate}" />
                    <attribute name="name" layout="${callsite}" />
                    <attribute name="level" layout="${level:upperCase=true}"/>
                    <attribute name="message" layout="${message}" />
                </layout>
                <!-- 输出换行+逗号+换行 -->
                <layout xsi:type="TextLayout">${newline},${newline}</layout>
            </layout>
        </target>
    </targets>

    <rules>
        <logger name="Microsoft.*" minlevel="Info" final="true" />
        <logger name="*" minlevel="Info" writeTo="tasksJsonFile" />
    </rules>
</nlog>

方法二:直接在TextLayout中拼接JSON和逗号

用${json}布局渲染器直接生成JSON内容,然后拼接逗号和换行,写法更简洁:

<?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"
      autoReload="true"
      internalLogLevel="Error"
      internalLogFile="c:\\LogFiles\TasksInternalLog.txt">

    <!-- 启用ASP.NET Core布局渲染器 -->
    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <targets>
        <target xsi:type="File" name="tasksJsonFile" fileName="c:\\logFiles\\json-${shortdate}.log">
            <layout xsi:type="TextLayout">
                ${json:includeAllProperties=false:attributes=time:${longdate},name:${callsite},level:${level:upperCase=true},message:${message}}${newline},${newline}
            </layout>
        </target>
    </targets>

    <rules>
        <logger name="Microsoft.*" minlevel="Info" final="true" />
        <logger name="*" minlevel="Info" writeTo="tasksJsonFile" />
    </rules>
</nlog>

额外提示:生成合法JSON数组

如果你的目标是生成可解析的JSON数组日志,不建议手动添加逗号(最后一条日志的逗号会导致JSON格式错误),可以直接使用NLog的JsonArrayLayout,它会自动处理条目间的逗号:

<target xsi:type="File" name="tasksJsonFile" fileName="c:\\logFiles\\json-${shortdate}.log">
    <layout xsi:type="JsonArrayLayout">
        <item xsi:type="JsonLayout" includeAllProperties="false">
            <attribute name="time" layout="${longdate}" />
            <attribute name="name" layout="${callsite}" />
            <attribute name="level" layout="${level:upperCase=true}"/>
            <attribute name="message" layout="${message}" />
        </item>
    </layout>
</target>

这种方式生成的日志是完整的JSON数组,自动在条目间添加逗号,最后一条无逗号,完全符合JSON规范。

内容的提问来源于stack exchange,提问作者Costa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:05:25