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

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加载失败。
修复方案
  1. 先升级相关Nuget包到兼容的稳定版本,这一步能解决80%的配置绑定问题:
    • 将Serilog.Settings.Configuration升级到≥3.4.0
    • 将Serilog.Sinks.Console升级到≥4.1.0(老版本Console Sink不支持从配置文件绑定自定义formatter实例)
  2. 修正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"
      }
    }
  }
]
  1. 检查Startup里加载配置的逻辑,确保传给ReadFrom.Configuration()的IConfiguration实例已经正确加载了Development环境的配置文件,不要只加载默认的appsettings.json漏掉环境特定的覆盖配置。标准的Logger初始化代码参考:
Log.Logger = new LoggerConfiguration()
    .ReadFrom.Configuration(configuration)
    .CreateLogger();
  1. 如果你暂时不想升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:51:06