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

NLog 5.2.4 无法过滤Microsoft.Extensions.Http日志求助

解决NLog屏蔽HttpClient请求日志的问题

问题根源

你日志中显示的Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler+Log.RequestPipelineStart是调用站点(Callsite),而非NLog规则匹配的Logger名称。你之前的规则都是基于Callsite来写的,自然无法匹配到真实的日志来源,导致无法屏蔽。

解决步骤

1. 确认真实的Logger名称

先修改日志模板(Layout),添加${logger}字段,这样就能在日志中看到每条日志对应的真实Logger名称:

<target xsi:type="File" name="default"
        layout="${longdate} ${logger} ${callsite:className=true} - ${threadid} - ${message}${onexception:${newline}EXCEPTION\: ${exception:format=ToString}}"
        fileName="${specialfolder:folder=CommonApplicationData}\mystuff\Log\test\mystuff.log"
        keepFileOpen="false"
        archiveFileName="${specialfolder:folder=CommonApplicationData}\mystuff\Log\test\Archive\mystuff_{#}.log"
        archiveNumbering="Date" archiveEvery="Day"
        maxArchiveFiles="60" />

重新运行程序,查看新生成的日志,找到那些HTTP请求日志对应的${logger}值(通常是System.Net.Http.HttpClient.*或Microsoft.Extensions.Http.Logging.*开头)。

2. 调整NLog规则屏蔽目标日志

根据获取到的真实Logger名称,添加对应的黑洞规则(无writeTo且final="true"表示丢弃日志),并调整规则顺序(具体规则放在通用规则前面,NLog规则从上到下匹配)。

修改后的完整<rules>配置示例:

<rules>
    <!-- Nlog log levels are:  Trace, Debug, Info, Warn, Error and Fatal.-->
    <logger name="MyStuff.HostedServices.*" writeTo="HostLog" minlevel="Debug" final="true"/>
    
    <!-- 屏蔽HttpClient相关日志(替换成你实际查到的Logger名称) -->
    <logger name="System.Net.Http.HttpClient.*" final="true" />
    <logger name="Microsoft.Extensions.Http.Logging.*" final="true" />
    
    <!-- 仅记录Microsoft的Error及以上级别到HostLog -->
    <logger name="Microsoft.*" writeTo="HostLog" minlevel="Error" final="true" />
    
    <!-- 屏蔽其他Microsoft的Trace到Warn级别日志 -->
    <logger name="Microsoft.*" minlevel="Trace" maxLevel="Warn" final="true" />
    
    <logger name="MyStuff.HostedServices.*" minlevel="Trace" maxLevel="Trace" final="true"/>
    <logger name="MyStuff.Services.*" minlevel="Trace" maxLevel="Trace" final="true" />
    
    <!-- 所有未被屏蔽的日志写入default文件 -->
    <logger name="*" writeTo="default" minlevel="Trace" />
</rules>

3. 关键说明

  • final="true":匹配到该规则的日志会停止后续规则的处理,无writeTo时日志直接被丢弃。
  • 规则顺序:更具体的Logger名称规则(如System.Net.Http.HttpClient.*)必须放在通用规则(如Microsoft.*)前面,否则通用规则会先匹配并拦截,导致具体规则失效。
  • 若你查到的Logger名称是其他值(比如带有客户端名称的System.Net.Http.HttpClient.MyClient.LogicalHandler),直接替换规则中的name属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 15:33:09