如何为指定HttpClient的单个健康检查URL禁用默认请求日志
解决方案
方案1:通过日志等级过滤实现(推荐,无侵入)
微软官方HttpClient默认输出的日志分类名遵循固定规则:
- 逻辑处理层日志分类:
System.Net.Http.HttpClient.{你注册的HttpClient名称}.LogicalHandler - 底层请求层日志分类:
System.Net.Http.HttpClient.{你注册的HttpClient名称}.ClientHandler
你只需要将对应分类的日志级别设置为None即可完全关闭该HttpClient的所有请求日志,不会对其他HttpClient产生任何影响,仅依赖标准Microsoft.Extensions.Logging组件实现。
如果通过配置文件配置(appsettings.json),示例如下:
{ "Logging": { "LogLevel": { "System.Net.Http.HttpClient.你的健康检查HttpClient名称.LogicalHandler": "None", "System.Net.Http.HttpClient.你的健康检查HttpClient名称.ClientHandler": "None" } } }
将配置中的你的健康检查HttpClient名称替换为你定义的Consts.HealthChecksHttpClientName常量值即可。
如果要在类库代码中直接内置规则,不需要使用者修改配置,可在注册服务时添加如下代码:
services.AddLogging(builder => { builder.AddFilter($"System.Net.Http.HttpClient.{Consts.HealthChecksHttpClientName}.*", LogLevel.None); });
方案2:移除指定HttpClient的日志处理器(性能更高)
如果你希望直接从请求链路中去掉日志相关逻辑,完全不产生日志性能开销,可以在注册该健康检查HttpClient时,单独移除它的日志处理器,不会影响其他HttpClient:
services.AddHttpClient(Consts.HealthChecksHttpClientName, c => { c.BaseAddress = new Uri(options.BaseUrl); c.DefaultRequestHeaders.Add("Connection", "close"); }) .ConfigureHttpMessageHandlerBuilder(builder => { // 过滤移除默认添加的两个日志处理器 var loggingHandlers = builder.AdditionalHandlers .Where(h => h.GetType().FullName is "Microsoft.Extensions.Http.Logging.LoggingScopeHttpMessageHandler" or "Microsoft.Extensions.Http.Logging.LoggingHttpMessageHandler") .ToList(); foreach (var handler in loggingHandlers) { builder.AdditionalHandlers.Remove(handler); } });
两种方案都不依赖第三方日志组件:
- 方案1实现简单,符合.NET日志配置规范,适合绝大多数场景
- 方案2完全移除日志链路,性能损耗更低,适合高频调用的健康检查场景
内容的提问来源于stack exchange,提问作者pwas
相关产品推荐
相关产品推荐

