如何在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
相关产品推荐
相关产品推荐

