NLog 5.0 过滤Microsoft.Extensions.Logging日志不生效问题
问题根因
过滤规则失效由两个核心配置问题导致:
- NLog通配符匹配逻辑不匹配:升级到.NET 6时一般会同步升级NLog.Web.AspNetCore依赖,新版本NLog中单星号
*仅能匹配不包含.的单级命名空间段,无法匹配Microsoft.Extensions.Http.Logging、Microsoft.AspNetCore.Authentication.JwtBearer、System.Net.Http.HttpClient这类多级命名空间的日志分类名。你配置的Microsoft.*、System.Net.Http.*规则完全没有命中目标日志,这些Info级日志直接落到最后一条全局*规则中被写入文件。
*注意:*日志中打印的类名是${callsite}渲染出的调用栈类名,不是NLog用来匹配路由规则的日志分类名(Logger Name),二者不一致很容易造成配置误判。 - NLog注册时机错误引发配置冲突:你把
UseNLog()放在了ConfigureWebHostDefaults委托内部,该时机晚于ConfigureLogging阶段的执行,导致之前设置的SetMinimumLevel(LogLevel.Warning)被NLog默认的全局Info级别覆盖,所有Info级系统日志都会被送到NLog路由层,没有被前置过滤。
修复方案
修正Program.cs的NLog注册逻辑
将NLog注册挪到Host根级配置,移除冗余的全局最低级别设置,过滤逻辑完全交给NLog管理,避免配置冲突,修正后代码如下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { logging.ClearProviders(); // 移除SetMinimumLevel配置,级别过滤完全由NLog规则控制 }) .UseNLog() // NLog注册提升到Host层面,保证主机启动早期的日志也能被正确过滤 .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseUrls("http://*:8282") .UseStartup<Startup>(); // 移除此处原有的UseNLog()调用 });
修正nlog.config的路由规则
将单星号通配符替换为双星号**(双星号可匹配包含.在内的任意字符,覆盖所有子级命名空间),简化系统日志过滤规则,修正后的rules节点如下:
<rules> <!-- 匹配所有Microsoft开头的多级命名空间日志,低于Warn级别直接丢弃,不再走后续规则 --> <logger name="Microsoft.**" finalMinLevel="Warn" /> <!-- 匹配所有System开头的多级命名空间日志,覆盖System.Net.Http等所有系统日志分类 --> <logger name="System.**" finalMinLevel="Warn" /> <logger name="*" minlevel="Info" writeTo="logfile" /> </rules>
可选验证操作
如果需要确认日志分类名匹配情况,可以临时在NLog的layout变量中加入${logger}字段,打印每条日志的真实分类名,排查是否存在漏匹配的分类:
<variable name="verbose" value="${longdate} ${uppercase:${level}} ${logger} ${callsite:className=true:fileName=false:includeSourcePath=false:methodName=true:cleanNamesOfAnonymousDelegates=false:skipFrames=0} ${message}" />
配置生效后即可直观看到每条日志对应的分类,确认规则覆盖范围。
内容的提问来源于stack exchange,提问作者JPelletier
相关产品推荐
相关产品推荐

