Serilog不使用outputTemplate实现CorrelationId输出的可行性咨询
Serilog 不配置outputTemplate输出CorrelationId的解决方案
核心说明
- outputTemplate 不是强制必填配置,你默认看不到CorrelationId的原因是:Serilog控制台Sink的默认文本输出模板仅包含
Timestamp、Level、Message、Exception四个固定字段,不会自动渲染所有通过Enrich添加的自定义属性。
不用显式配置outputTemplate的实现方案
方案1:使用结构化JSON格式化输出
直接给控制台Sink传入内置的结构化格式化器,这类格式化器会自动输出日志事件携带的所有属性(包括CorrelationId),不需要手动配置输出模板,示例代码:
using Serilog.Formatting.Compact; Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console(new RenderedCompactJsonFormatter()) .Enrich.WithCorrelationId() .CreateLogger();
输出的JSON结构中会自动包含CorrelationId字段,更适合日志系统采集、解析的场景。
方案2:自定义格式化器封装模板(不显式写outputTemplate参数)
如果你需要人类可读的文本格式,又不想在每个Sink的配置里写长串的outputTemplate,可以自己封装一个继承自ITextFormatter的实现类,把包含CorrelationId的模板逻辑写在格式化器里,配置时直接传入格式化器即可,示例:
// 自定义格式化器 public class CustomTextFormatter : ITextFormatter { private readonly OutputTemplateRenderer _renderer = new OutputTemplateRenderer( "[{Timestamp:HH:mm:ss} {CorrelationId} {Level:u3}] {Message:lj}{NewLine}{Exception}" ); public void Format(LogEvent logEvent, TextWriter output) { _renderer.Format(logEvent, output); } } // 配置时直接传入,不需要写outputTemplate参数 Log.Logger = new LoggerConfiguration() .MinimumLevel.Debug() .WriteTo.Console(new CustomTextFormatter()) .Enrich.WithCorrelationId() .CreateLogger();
补充说明
如果你坚持用默认的纯文本格式,又不想做任何自定义配置,是没办法输出CorrelationId的。因为默认的文本输出逻辑是严格按照预设模板渲染的,没有在模板中声明的属性不会被输出,只有结构化格式化器才会自动导出所有属性。
内容的提问来源于stack exchange,提问作者user584018
相关产品推荐
相关产品推荐

