如何在Serilog .NET中配置JSON格式化程序的输出模板
Serilog JSON日志自定义模板不生效的解决办法
问题原因
你当前的JSON日志Sink配置中,同时指定了CompactJsonFormatter和template参数,但CompactJsonFormatter是固定格式的格式化器,不会读取你的自定义模板。要使用Serilog.Expressions实现自定义JSON结构,必须改用ExpressionTemplate作为格式化器。
修改后的配置
将第二个File Sink的配置调整如下,替换原有的格式化器参数:
{ "Serilog": { "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Expressions" ], "MinimumLevel": { "Default": "Information", "Override": { "Microsoft.AspNetCore.Mvc": "Warning", "Microsoft.AspNetCore.Routing": "Warning", "Microsoft.AspNetCore.Hosting": "Warning" } }, "WriteTo": [ { "Name": "File", "Args": { "path": "Logs/log-.txt", "rollingInterval": "Day", "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level:u3}] {Message:lj}{NewLine}{Exception}", "fileSizeLimitBytes": 10485760, "rollOnFileSizeLimit": true, "shared": true, "flushToDiskInterval": 1 } }, { "Name": "File", "Args": { "path": "Logs/logjson-.json", "rollingInterval": "Day", "fileSizeLimitBytes": 10485760, "rollOnFileSizeLimit": true, "formatter": "Serilog.Expressions.ExpressionTemplate, Serilog.Expressions", "formatterArgs": { "template": "{ {@t, @mt, @l: if @l = 'Information' then undefined() else @l, @x, ..@p} }" }, "shared": true, "flushToDiskInterval": 1 } } ], "Enrich": [ "FromLogContext" ] } }
关键修改点
- 移除了直接写在
Args里的template参数,改用formatterArgs传递模板 - 将格式化器替换为
Serilog.Expressions.ExpressionTemplate,这是支持表达式自定义的JSON格式化器 - 模板逻辑保持你原来的需求:Info级别日志不输出
@l字段,保留@t、@mt、异常信息@x,以及其他剩余属性..@p
注意事项
- 确认已安装
Serilog.Expressions和Serilog.Sinks.FileNuGet包 - 重启应用后,JSON日志会按照你定义的模板生成,多余的默认属性会被过滤
内容的提问来源于stack exchange,提问作者JOYBOY
相关产品推荐
相关产品推荐

