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

Serilog JSON配置问题:控制台仅输出Info级日志不生效

问题分析与解决

核心问题有两个:

  1. JSON配置参数位置错误:你把restrictedToMinimumLevel直接放在了控制台sink的根节点下,Serilog的sink参数必须放在Args节点内才能被识别,因此配置的级别限制根本没生效。
  2. BootstrapLogger重复添加控制台接收器:你在初始化Log.Logger时直接调用了.WriteTo.Console(),这个接收器没有任何级别限制,会和后续通过配置加载的控制台接收器共存,导致Debug级日志被这个Bootstrap阶段的控制台接收器输出。

修复步骤

1. 修正JSON配置文件

将控制台sink的restrictedToMinimumLevel移到Args节点中:

"Serilog": {
  "MinimumLevel": "Debug",
  "WriteTo": [
    {
      "Name": "Console",
      "Args": {
        "restrictedToMinimumLevel": "Information"
      }
    },
    {
      "Name": "File",
      "Args": {
        "path": "../logs/log-.txt",
        "rollingInterval": "Day"
      }
    }
  ]
}

2. 调整BootstrapLogger配置

移除BootstrapLogger中直接添加的无限制控制台接收器,或者给它加上级别限制,避免重复输出。推荐两种方案:

方案一:给Bootstrap的控制台接收器添加级别限制

修改初始化代码,让启动阶段的控制台日志也遵循预期的级别:

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Information)
    .CreateBootstrapLogger();

方案二:移除Bootstrap的控制台接收器,完全依赖配置加载

如果不需要启动阶段的额外控制台日志,可以直接去掉.WriteTo.Console():

Log.Logger = new LoggerConfiguration()
    .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
    .Enrich.FromLogContext()
    .CreateBootstrapLogger();

验证效果

修改后重新启动应用,控制台只会输出Information及以上级别的日志,文件则会输出Debug及以上级别的日志,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 13:07:43