如何配置HttpClient在所有日志级别下禁用请求/响应头日志?
如何在不调整整体日志级别下禁用HttpClient的请求/响应头日志
有两种可行方案可以实现需求,无需将System.Net.Http.HttpClient.CustomHttpClient的日志级别调高:
方案一:通过日志配置过滤特定事件ID
HttpClient的请求头、响应头日志对应固定的Trace级事件ID(请求头为100,响应头为101),可以在配置文件中添加过滤规则,单独屏蔽这些事件的日志,同时保留其他级别的日志输出。
在appsettings.json中添加以下配置:
"Logging": { "LogLevel": { "Default": "Information", "System.Net.Http.HttpClient.CustomHttpClient.LogicalHandler": "Trace" }, "Filters": [ { "CategoryName": "System.Net.Http.HttpClient.CustomHttpClient.LogicalHandler", "EventId": 100, "LogLevel": "None" }, { "CategoryName": "System.Net.Http.HttpClient.CustomHttpClient.LogicalHandler", "EventId": 101, "LogLevel": "None" } ] }
该配置会保留LogicalHandler的Trace级别日志,但直接忽略掉记录请求头、响应头的事件。
方案二:自定义消息处理器替代默认日志逻辑
创建一个自定义的DelegatingHandler,自行控制日志输出内容,完全跳过请求/响应头的记录,然后替换掉HttpClient默认的日志处理器。
1. 定义自定义处理器
public class NoHeaderLoggingHandler : DelegatingHandler { private readonly ILogger<NoHeaderLoggingHandler> _logger; public NoHeaderLoggingHandler(ILogger<NoHeaderLoggingHandler> logger) { _logger = logger; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 仅记录请求基本信息,不包含头 _logger.LogInformation("开始处理HTTP请求:{Method} {Uri}", request.Method, request.RequestUri); var response = await base.SendAsync(request, cancellationToken); // 仅记录响应基本信息,不包含头 _logger.LogInformation("完成HTTP请求处理:{Method} {Uri},状态码:{StatusCode}", request.Method, request.RequestUri, response.StatusCode); return response; } }
2. 注册自定义处理器到DI容器
// 先注册自定义处理器 services.AddTransient<NoHeaderLoggingHandler>(); // 配置CustomHttpClient时替换默认日志处理器 services.AddHttpClient<CustomHttpClient>(config => { config.BaseAddress = new Uri(CustomBaseAddress); config.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(AuthorizationKey, AuthorizationValue); }) .AddHttpMessageHandler<NoHeaderLoggingHandler>() .RemoveAllLoggers(); // 移除默认的日志处理逻辑
这种方式完全由你控制日志输出内容,灵活度更高,适合需要自定义日志格式的场景。
内容的提问来源于stack exchange,提问作者Petr Nečas
相关产品推荐
相关产品推荐

