Serilog无法读取appsettings.json中Logging节点配置的问题咨询
问题解决:Serilog日志级别配置不生效
问题描述
我在使用Serilog配置日志时,发现appsettings.json中的日志级别设置完全不生效,日志始终默认使用Information级别。我的代码和两种尝试过的配置如下:
日志配置代码:
var loggerConfig = new LoggerConfiguration() //.MinimumLevel //.Information() //These are not working from appsettings.json possibly because we are using Serilog? //.MinimumLevel.Override("Microsoft.EntityFrameworkCore.Database.Command", LogEventLevel.Warning) .ReadFrom.Configuration(configuration,"Logging") .WriteTo.Console() .WriteTo.File( $"{configuration.GetValue<string>("logFilePath")}{DateTime.Now.Date:yyyy_MM_dd}_{assemblyName}.log"); var logger = loggerConfig.CreateLogger(); services.AddLogging(loggingBuilder => { loggingBuilder.ClearProviders(); loggingBuilder.AddSerilog(logger); });
第一种尝试的appsettings.json配置:
"Logging": { "LogLevel": { "Default": "Debug", "Microsoft": "Information", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore.Database.Command": "Warning" } }
第二种尝试的配置:
"Logging": { "MinimumLevel": { "Default": "Debug", "Override": { "System": "Information", "Microsoft": "Information", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore": "Warning" } } }
原因分析
- 配置结构不匹配:Serilog的配置规则和ASP.NET Core默认的
Logging节点结构不同,直接读取Logging节点无法正确解析级别设置。 - 默认级别 fallback:Serilog如果未正确读取到级别配置,会默认使用
Information作为最低日志级别。 - 依赖包缺失:若未安装
Serilog.Settings.Configuration包,ReadFrom.Configuration方法无法正常加载配置。
解决方案
步骤1:安装必要依赖包
确保项目中已安装以下NuGet包:
- Serilog.AspNetCore
- Serilog.Settings.Configuration
步骤2:使用Serilog专用配置节点(推荐)
修改appsettings.json,添加Serilog专属配置节点,结构完全匹配Serilog的解析要求:
"Serilog": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore.Database.Command": "Warning" } }, "WriteTo": [ { "Name": "Console" } // 若要在配置中定义文件输出,可添加以下配置,否则保留代码中的WriteTo.File即可 // { // "Name": "File", // "Args": { // "path": "logs/your_assembly_name_.log", // "rollingInterval": "Day" // } // } ] }
步骤3:调整代码读取正确配置节点
修改日志配置代码,让Serilog读取默认的Serilog节点:
var loggerConfig = new LoggerConfiguration() .ReadFrom.Configuration(configuration) // 无需指定节点,默认读取"Serilog"节点 .WriteTo.File( $"{configuration.GetValue<string>("logFilePath")}{DateTime.Now.Date:yyyy_MM_dd}_{assemblyName}.log"); var logger = loggerConfig.CreateLogger(); services.AddLogging(loggingBuilder => { loggingBuilder.ClearProviders(); loggingBuilder.AddSerilog(logger); });
可选:若坚持使用现有Logging节点
如果不想新增Serilog节点,需要调整Logging节点的结构完全匹配Serilog的MinimumLevel格式,并且确保代码中读取时Serilog能正确解析:
"Logging": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "Microsoft.Hosting.Lifetime": "Information", "Microsoft.EntityFrameworkCore.Database.Command": "Warning" } } }
同时代码中保持.ReadFrom.Configuration(configuration, "Logging"),但这种方式容易和ASP.NET Core默认日志配置混淆,不推荐。
验证
启动项目后,尝试输出Debug级别的日志,确认是否能正常记录;同时检查EF Core的数据库命令日志是否仅输出Warning及以上级别,验证配置是否生效。
内容的提问来源于stack exchange,提问作者Codesmith
相关产品推荐
相关产品推荐

