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
相关产品推荐
相关产品推荐

