使用Serilog覆盖Microsoft.*、AspNet*等命名空间的日志级别
问题解答
你的配置生效假设确实存在错误
当你使用Serilog作为Microsoft.Extensions.Logging(MEL)的日志提供者时,MEL原生的Logging配置节点不会自动被Serilog完全继承。Serilog有独立的日志级别过滤逻辑,默认不会读取MEL的LogLevel规则,这就是为什么你设置的Microsoft: Information没有生效、AspNetCore基础架构仍输出Debug日志的核心原因。
解决方法:让Serilog正确应用命名空间级别规则
有两种常用方式实现你的需求,确保Microsoft.*命名空间只输出Information及以上级别日志:
方式1:在代码中显式配置级别覆盖
在Program.cs的主机配置中,直接指定Serilog的最低级别及命名空间覆盖规则:
var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog((context, loggerConfig) => { loggerConfig // 读取配置文件中的Serilog相关配置(如输出目标) .ReadFrom.Configuration(context.Configuration) // 设置默认日志级别为Debug(对应原配置的Default规则) .MinimumLevel.Debug() // 覆盖Microsoft命名空间的级别为Information .MinimumLevel.Override("Microsoft", Serilog.Events.LogEventLevel.Information) // 覆盖System命名空间的级别为Information .MinimumLevel.Override("System", Serilog.Events.LogEventLevel.Information); }); // 后续应用构建逻辑... var app = builder.Build();
方式2:通过配置文件统一管理Serilog规则
修改appsettings.json,添加Serilog专属配置节点,把原MEL的级别规则迁移过来:
{ "Logging": { // 可保留该节点,供其他MEL日志提供者使用,但Serilog不会默认读取 "LogLevel": { "Default": "Debug", "System": "Information", "Microsoft": "Information" } }, "Serilog": { "MinimumLevel": { "Default": "Debug", "Override": { "Microsoft": "Information", "System": "Information" } }, "WriteTo": [ { "Name": "Console" } // 可添加其他输出目标,如文件、Seq等 ] } }
然后在Program.cs中直接读取Serilog配置:
var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog((context, loggerConfig) => loggerConfig.ReadFrom.Configuration(context.Configuration)); // 后续应用构建逻辑... var app = builder.Build();
关键注意点
- 建议统一用Serilog的配置节点管理级别规则,避免同时依赖MEL和Serilog的配置导致混淆。
- 确保已安装必要NuGet包:
Serilog.AspNetCore(核心集成包)、Serilog.Settings.Configuration(读取配置文件用)。
内容的提问来源于stack exchange,提问作者Chris F Carroll
相关产品推荐
相关产品推荐

