.NET 7中结合Serilog使用ILogger时的日志级别配置问题
解决方案:让Serilog兼容Microsoft ILogger的"Logging"配置节
核心思路
通过Serilog与Microsoft.Extensions.Logging的集成能力,让Serilog复用Logging节的配置作为日志过滤器,同时隐藏Serilog的具体实现和专属配置节,让应用仅依赖Microsoft日志抽象。
步骤实现
依赖包准备
确保项目引用Serilog.AspNetCore(Web项目)或Serilog.Extensions.Hosting(非Web项目),以及对应版本的Microsoft.Extensions.Logging相关包。Host配置调整
在Program.cs中,先加载配置并提取Logging节,再将其转换为Serilog可识别的过滤器,同时配置Serilog的核心功能(如日志作用域、ApplicationInsights输出):var builder = WebApplication.CreateBuilder(args); // 提取Microsoft Logging配置节 var loggingConfigSection = builder.Configuration.GetSection("Logging"); // 配置Serilog,复用Logging节的过滤规则 builder.Host.UseSerilog((context, services, loggerConfig) => { loggerConfig // 可选:若需Serilog高级配置,仍可读取Serilog节(工具包内部维护,应用层无需感知) // .ReadFrom.Configuration(context.Configuration) // 应用Microsoft Logging的过滤规则 .Filter.ByIncludingOnly(Microsoft.Extensions.Logging.LogFilter.CreateFilter(loggingConfigSection)) // 启用日志作用域支持(解决ApplicationInsights原生不足) .Enrich.FromLogContext() // 输出到ApplicationInsights .WriteTo.ApplicationInsights( services.GetRequiredService<TelemetryConfiguration>(), TelemetryConverter.Traces); }); // 后续服务注册与应用启动逻辑... var app = builder.Build();配置文件简化
应用层仅需维护Logging节,无需暴露Serilog节(若工具包内部无需Serilog专属配置,可完全移除):{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning", "MyApp.BusinessLogic": "Debug" } } }
关键说明
LogFilter.CreateFilter方法会将Logging节的配置解析为Serilog的过滤器规则,实现与原生ILogger一致的日志级别过滤逻辑。- 日志作用域通过
Enrich.FromLogContext()启用,应用层直接使用ILogger.BeginScope()即可,无需感知Serilog的存在。 - 若需Serilog的高级特性(如自定义Sink、复杂Enricher),可在工具包内部维护
Serilog配置节,应用层无需修改或感知。
内容的提问来源于stack exchange,提问作者Kjell Rilbe
相关产品推荐
相关产品推荐

