ASP.NET Core 5.0如何自定义HttpClient日志级别以管控默认信息日志输出
解决方案
推荐最优实现为自定义HttpMessageHandler方案,优势是不影响项目中其他HttpClient实例的默认日志行为、可与你的自定义日志规则完全对齐、支持配置热更新,也可灵活自定义日志内容。
实现步骤
- 先全局关闭HttpClient默认日志,在
appsettings.json中修改日志配置:
"Logging": { "LogLevel": { "Default": "Warning", "System.Net.Http.HttpClient": "None" } }
- 实现自定义日志Handler,逻辑和你现有
LogInfo规则对齐:
public class CustomSyncLogHandler : DelegatingHandler { private readonly ILogger<CustomSyncLogHandler> _logger; // 如果需要运行时修改配置不重启就生效,可把IOptions换成IOptionsSnapshot private readonly IOptions<你的配置类名> _config; public CustomSyncLogHandler(ILogger<CustomSyncLogHandler> logger, IOptions<你的配置类名> config) { _logger = logger; _config = config; } protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { // 和你的LogInfo(4,xxx)规则完全一致 if (4 <= _config.Value.LogLevel) { _logger.LogInformation("Start processing HTTP request {Method} {Url}", request.Method, request.RequestUri); } var response = await base.SendAsync(request, cancellationToken); if (4 <= _config.Value.LogLevel) { _logger.LogInformation("End processing HTTP request {Method} {Url} - Status {StatusCode}", request.Method, request.RequestUri, (int)response.StatusCode); } return response; } }
- 在Startup中注册Handler,并绑定到你同步任务专用的命名HttpClient:
services.AddTransient<CustomSyncLogHandler>(); // 注册命名HttpClient,仅给你的同步任务使用 services.AddHttpClient("FooSyncClient") .AddHttpMessageHandler<CustomSyncLogHandler>();
- 修改你原有代码中创建HttpClient的逻辑,使用指定命名的实例:
var client = _clientFactory.CreateClient("FooSyncClient");
轻量替代方案(全局生效,无热更新)
如果你的项目所有HttpClient都要遵循这个日志规则,不需要单独区分,也可以直接配置日志过滤规则实现:
services.AddLogging(builder => { var sp = services.BuildServiceProvider(); var config = sp.GetRequiredService<IOptions<你的配置类名>>().Value; builder.AddFilter("System.Net.Http.HttpClient", logLevel => { // 只有自定义级别>=4时才输出Information级别的HttpClient日志 if (logLevel == LogLevel.Information) { return 4 <= config.LogLevel; } // 错误、警告级别的日志正常输出,不需要的话可以自行修改规则 return true; }); });
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

