appSettings.json中Serilog Expression Template配置被忽略不生效
问题定位
这个配置不生效是几个Serilog配置加载的常见坑叠加导致的,Serilog加载配置失败时默认静默回退到已初始化的bootstrap logger,不会主动抛错,所以你看不到具体报错,只会一直输出旧模板的日志。
按下面的顺序排查修复即可:
- 先开启Serilog的内部SelfLog看真实报错,把这行代码加在你Program.cs初始化bootstrap logger的最前面,所有Serilog相关代码执行前跑:
Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine($"Serilog内部错误: {msg}"));
开了之后只要配置加载有问题,控制台会直接输出具体的错误原因,比如类型找不到、参数不匹配、程序集加载失败之类的,不用瞎猜。
- 第一个核心问题是版本兼容:你用的
Serilog.Settings.Configuration 3.3.0对嵌套对象类型(也就是你配置里的formatter节点)的自动绑定有已知缺陷,这个版本不会自动扫描Using节点里声明的Serilog.Expressions程序集,找不到ExpressionTemplate类型的时候就会直接跳过Console Sink的初始化,回退到旧logger。 - 第二个问题是Console Sink的参数冲突:你之前用默认outputTemplate的时候把
theme参数放在Console的Args层级,换成自定义formatter之后,这个参数位置是错的——ExpressionTemplate自己接收theme参数,Console Sink同时接formatter和theme参数会触发参数校验失败,导致Sink加载失败。
修复方案
- 先升级相关Nuget包到兼容的稳定版本,这一步能解决80%的配置绑定问题:
- 将
Serilog.Settings.Configuration升级到≥3.4.0 - 将
Serilog.Sinks.Console升级到≥4.1.0(老版本Console Sink不支持从配置文件绑定自定义formatter实例)
- 将
- 修正
appSettings.Development.json里的WriteTo节点配置,把theme参数挪到formatter节点内部,正确配置如下:
"WriteTo": [ { "Name": "Console", "Args": { "formatter": { "type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions", "template": "[{@t:HH:mm:ss} {@l:u3}{#if SourceContext is not null} ({SourceContext}){#end}] {@m}\n{@x}", "theme": "Serilog.Sinks.SystemConsole.Themes.AnsiConsoleTheme::Code, Serilog.Sinks.Console" } } } ]
- 检查Startup里加载配置的逻辑,确保传给
ReadFrom.Configuration()的IConfiguration实例已经正确加载了Development环境的配置文件,不要只加载默认的appsettings.json漏掉环境特定的覆盖配置。标准的Logger初始化代码参考:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration) .CreateLogger();
- 如果你暂时不想升级
Serilog.Settings.Configuration,要保留3.3.0版本,就需要显式指定要扫描的程序集,修改ReadFrom的调用代码:
Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(configuration, new ConfigurationReaderOptions { Assemblies = new[] { typeof(Serilog.Templates.ExpressionTemplate).Assembly } }) .CreateLogger();
验证
改完之后启动项目,如果SelfLog没有输出错误信息,日志就会按你定义的Expression Template格式输出。如果还有SelfLog报错,根据报错信息排查即可,常见的剩余问题是模板语法错误、程序集版本不匹配。
内容的提问来源于stack exchange,提问作者HanSolo
相关产品推荐
相关产品推荐

