如何用Serilog.Sinks.Seq自定义Seq日志格式化?
解决Seq日志格式化不生效的问题
核心原因
Seq是结构化日志接收器,不支持直接用outputTemplate,它依赖Serilog的结构化事件数据。要自定义Seq的日志显示格式,必须通过Serilog.Expressions的ExpressionTemplate,但得确保配置正确、依赖包安装到位。
排查与解决步骤
1. 先确认装对了NuGet包
必须安装这两个包(版本要和你的Serilog版本匹配):
Serilog.Sinks.SeqSerilog.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
相关产品推荐
相关产品推荐

