You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core中如何用NLog关闭Microsoft INFO级日志且保留其他日志

解决NLog屏蔽Microsoft组件INFO日志但保留自定义INFO日志的问题

这个问题我之前也碰到过,核心原因是NLog的规则匹配逻辑:它默认会让一条日志条目匹配所有符合条件的规则,而不是匹配到第一条就停止。你当前的配置里,虽然先给Microsoft.*设置了只输出Error及以上级别,但后面的name="*"规则会再次匹配包括Microsoft在内的所有日志,并且输出Info及以上级别,相当于两条规则都对Microsoft的日志生效,所以你的需求没实现。

正确的解决方案

最简洁有效的方法是给Microsoft.*的规则加上final="true"属性,这个属性的作用是:当日志条目匹配到这条规则后,就停止继续匹配后续的其他规则,这样后面的通用*规则就不会再处理Microsoft的日志了。

修改后的配置如下:

<rules>
  <!-- 处理Microsoft组件日志,final="true"阻止后续规则再匹配这些日志 -->
  <logger name="Microsoft.*" minlevel="Error" writeTo="nxlog_json" final="true" />
  <logger name="Microsoft.*" minlevel="Error" writeTo="human_text_file" final="true" />
  
  <!-- 处理所有非Microsoft的日志,因为Microsoft的已经被前面的规则拦截了 -->
  <logger name="*" minlevel="Info" writeTo="nxlog_json" />
  <logger name="*" minlevel="Info" writeTo="human_text_file" />
</rules>

另一种可选方案(排除法)

如果你不想用final属性,也可以给通用规则加上exclude属性,明确排除Microsoft.*的日志:

<rules>
  <logger name="Microsoft.*" minlevel="Error" writeTo="nxlog_json" />
  <logger name="Microsoft.*" minlevel="Error" writeTo="human_text_file" />
  
  <!-- 排除Microsoft前缀的日志,只处理其他自定义日志 -->
  <logger name="*" minlevel="Info" writeTo="nxlog_json" exclude="Microsoft.*" />
  <logger name="*" minlevel="Info" writeTo="human_text_file" exclude="Microsoft.*" />
</rules>

关键注意点

  • NLog的规则是按顺序执行的,一定要把更具体的规则(比如Microsoft.*)放在通用规则(*)的前面,否则final或者exclude都不会生效。
  • final="true"是更推荐的方式,因为它逻辑更清晰,尤其是当你有多个需要特殊处理的日志前缀时,维护起来更方便。

内容的提问来源于stack exchange,提问作者Parkyster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:21:28