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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:45:01