使用Serilog的WriteTo.Console时如何输出MessageTemplate属性?
解决方案
可以直接在Serilog Console的outputTemplate中配置输出MessageTemplate属性,Serilog输出模板原生支持引用该内置结构化属性,无需改用全量JSON格式化输出。
修改后配置示例
你只需要在原有输出模板中添加{MessageTemplate:j}占位符即可,:j格式限定符会自动对模板内容做JSON转义,避免特殊字符导致格式错误:
.WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj} MessageTemplate={MessageTemplate:j} {Properties:j}{NewLine}{Exception}")
优化方案(可选)
如果你希望MessageTemplate和其他自定义属性合并为同一个合法JSON片段,方便Filebeat统一解析,可使用Serilog.Expressions包提供的ExpressionTemplate实现更灵活的结构化输出,无需手动处理JSON符号拼接:
- 先安装NuGet包
Serilog.Expressions - 修改Console输出配置:
.WriteTo.Console( outputTemplate: new ExpressionTemplate( "[{@t:HH:mm:ss} {@l:u3}] {@m:lj} { {MessageTemplate: @mt, ..@p} }\n{@x}") )
两种方案都保留了控制台输出的人工可读性,同时会输出完整的MessageTemplate属性,可直接在Kibana中基于消息模板做聚合统计。
内容的提问来源于stack exchange,提问作者Apogee
相关产品推荐
相关产品推荐

