NLog添加规则失效:无法屏蔽Microsoft调试日志
解决NLog屏蔽Microsoft调试日志的问题
你的问题出在NLog规则的匹配顺序和优先级上。当前的规则写法中,全局规则(无Logger名称过滤)会优先匹配所有日志,包括Microsoft.*开头的日志。当nLogLevel设为Debug时,全局规则允许Debug及以上级别的日志,所以Microsoft的Debug日志会被这条规则直接捕获并记录,后续针对Microsoft.*的规则无法覆盖前面的全局规则。
调整方案一:调整规则顺序并启用Final标记
把针对Microsoft.*的规则放在全局规则前面,并且设置final参数为true,这样匹配到Microsoft.*的日志后,就不会再执行后续的全局规则:
// 先处理Microsoft日志,仅记录Info及以上级别,标记为Final loggingConfiguration.AddRule(LogLevel.Info, LogLevel.Fatal, logDb, "Microsoft.*", true); loggingConfiguration.AddRule(LogLevel.Info, LogLevel.Fatal, logfile, "Microsoft.*", true); // 处理其他所有日志,使用配置的nLogLevel loggingConfiguration.AddRule(nLogLevel, LogLevel.Fatal, logDb); loggingConfiguration.AddRule(nLogLevel, LogLevel.Fatal, logfile);
调整方案二:全局规则排除Microsoft.*
修改全局规则,排除Microsoft.*开头的日志,再单独配置Microsoft日志的级别:
// 全局规则排除Microsoft.*,仅处理其他日志 loggingConfiguration.AddRule(nLogLevel, LogLevel.Fatal, logDb, "*", true, "Microsoft.*"); loggingConfiguration.AddRule(nLogLevel, LogLevel.Fatal, logfile, "*", true, "Microsoft.*"); // 单独配置Microsoft日志的记录级别 loggingConfiguration.AddRule(LogLevel.Info, LogLevel.Fatal, logDb, "Microsoft.*"); loggingConfiguration.AddRule(LogLevel.Info, LogLevel.Fatal, logfile, "Microsoft.*");
两种方案都能实现:当nLogLevel设为Debug时,仅记录非Microsoft的Debug日志,Microsoft日志只记录Info及以上级别;当nLogLevel设为Info时,所有日志都只记录Info及以上级别。
内容的提问来源于stack exchange,提问作者BladeZ
相关产品推荐
相关产品推荐

