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

如何用Serilog.Sinks.Seq自定义Seq日志格式化?

解决Seq日志格式化不生效的问题

核心原因

Seq是结构化日志接收器,不支持直接用outputTemplate,它依赖Serilog的结构化事件数据。要自定义Seq的日志显示格式,必须通过Serilog.Expressions的ExpressionTemplate,但得确保配置正确、依赖包安装到位。

排查与解决步骤

1. 先确认装对了NuGet包

必须安装这两个包(版本要和你的Serilog版本匹配):

  • Serilog.Sinks.Seq
  • Serilog.Expressions

用.NET CLI安装的话,执行这两句:

dotnet add package Serilog.Sinks.Seq
dotnet add package Serilog.Expressions

2. 检查appsettings.json的配置格式

Seq的ExpressionTemplate要放在formatter节点下,不能和outputTemplate同级。正确配置示例:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Seq" ],
    "MinimumLevel": "Information",
    "WriteTo": [
      {
        "Name": "Console",
        "Args": {
          "outputTemplate": "[{Timestamp:HH:mm:ss} {Level:u3}] {Message:lj}{NewLine}{Exception}"
        }
      },
      {
        "Name": "Seq",
        "Args": {
          "serverUrl": "http://localhost:5341",
          "formatter": {
            "Name": "ExpressionTemplate",
            "Args": {
              "expression": "[{@Timestamp:HH:mm:ss} {@Level:u3}] {Message:lj}{#if @Exception is not null}\r\n{@Exception}{#end}"
            }
          }
        }
      }
    ]
  }
}

注意点:

  • formatter是Seq的Args子节点,必须指定Name为ExpressionTemplate
  • 表达式要用Serilog.Expressions的语法,比如@Timestamp、@Level,条件判断用#if

3. 别搞混"消息模板"和"显示格式"

Seq默认显示的是日志的原始消息模板(比如你写Log.Information("User {UserId} logged in", userId)里的User {UserId} logged in),而ExpressionTemplate是控制Seq里"事件消息"的显示格式,不是修改原始模板。想让Seq和Console格式一致,就得让表达式完全对应Console的outputTemplate逻辑。

4. 检查Seq的视图切换

有时候你看到的默认格式可能是Seq的"原始事件"视图,切换到"消息"视图就能看到自定义格式的效果。

5. 确认配置加载逻辑没问题

如果是代码里初始化Serilog,要确保正确读取了appsettings.json:

var configuration = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json")
    .Build();

Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();

别在代码里单独配置Seq Sink时漏掉formatter,不然会覆盖配置文件的设置。

常见踩坑点

  • 直接给Seq配置outputTemplate:Seq不支持这个参数,配了也白搭
  • 没装Serilog.Expressions包:就算写了ExpressionTemplate也不会生效,直接 fallback到默认格式
  • 表达式语法错了:比如用了普通Serilog模板语法而非Serilog.Expressions语法,导致解析失败,用默认格式

内容的提问来源于stack exchange,提问作者BOGsi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:58:23