.NET6中Serilog无法记录Program.cs内builder.Build()后的日志
问题分析与解决方案
核心原因
- 日志切换机制:
builder.Build()执行后,Serilog会用从appsettings.json读取的配置替换掉初始化的bootstrap logger。bootstrap logger未应用级别过滤,所以之前的Log.Information能正常输出;而之后的日志受配置里的级别规则限制。 - 命名空间不匹配:.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
相关产品推荐
相关产品推荐

