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

.NET6中Serilog无法记录Program.cs内builder.Build()后的日志

问题分析与解决方案

核心原因

  1. 日志切换机制:builder.Build()执行后,Serilog会用从appsettings.json读取的配置替换掉初始化的bootstrap logger。bootstrap logger未应用级别过滤,所以之前的Log.Information能正常输出;而之后的日志受配置里的级别规则限制。
  2. 命名空间不匹配:.NET6的顶级语句(隐式Program类)默认处于全局命名空间,并非项目设置的DefaultNameSpace。你在appsettings.json里配置的"MyNameSpace.Program": "Information"无法匹配实际的Program类,导致级别覆盖规则失效,默认的Error级别直接过滤掉了Information日志。

解决方法

方法一:给Program.cs显式添加命名空间

在Program.cs最顶部添加与项目设置一致的命名空间声明:

namespace MyNameSpace;

// 原有顶级语句代码...
Log.Logger = new LoggerConfiguration()    
    .WriteTo.Console()
    .CreateBootstrapLogger();
// ...后续代码

这样appsettings.json里的MyNameSpace.Program就能正确匹配,级别覆盖规则生效,Build()之后的Information日志会被正常输出。

方法二:修改appsettings.json的级别覆盖规则

把Override里的MyNameSpace.Program改为直接匹配类名Program(因为隐式Program在全局命名空间):

"Serilog": {
  "MinimumLevel": {
    "Default": "Error",
    "Override": {
      "Microsoft": "Warning",        
      "Program": "Information"
    }
  },
  // 其他配置...
}

无需修改Program.cs代码,就能让全局命名空间下的Program类的Information日志绕过默认级别限制。

额外说明

app.Run()是阻塞方法,它之后的Log.Information("Application Started")永远不会执行(app.Run()会一直运行到应用停止),这条日志可以移除或者调整到app.Run()之前执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 01:42:27