Serilog JSON配置问题:控制台仅输出Info级日志不生效
问题分析与解决
核心问题有两个:
- JSON配置参数位置错误:你把
restrictedToMinimumLevel直接放在了控制台sink的根节点下,Serilog的sink参数必须放在Args节点内才能被识别,因此配置的级别限制根本没生效。 - 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
相关产品推荐
相关产品推荐

