通过 HttpClient 禁用单个 url 的请求日志记录
Disable request logging via HttpClient for single url
我有一个自己的库,它通过 http 客户端公开运行状况检查实现:
在我的库中的 StartupExtensions 中:
services.AddHttpClient(Consts.HealthChecksHttpClientName, c =>
{
c.BaseAddress = new Uri(options.BaseUrl);
c.DefaultRequestHeaders.Add("Connection", "close");
});
如何关闭健康检查的默认日志记录 url?
我知道我可以禁用所有日志:
services.RemoveAll<IHttpMessageHandlerBuilderFilter>();
我不想从不属于该库的所有 http 客户端中删除所有日志 - 只想为我的 http 客户端禁用单个 url。
是否只针对指定的HttpClient覆盖?
我不想使用 Serilog
- 仅使用标准 Microsoft.Extensions.Logging
您的日志记录过滤器应该取决于我们如何使用 HttpClient
。例如,像这样使用
using var weatherHttpClient = new HttpClient()
// make using here
AFAIK,这种情况下无法将日志记录与 HttpClient
分开。
如果我们通过 DI 使用 HttpClient
,我们可以制作这样的过滤器。
// Register with DI. I'm just a fan of named HttpClient, use your register as wished
services.AddHttpClient(nameof(WeatherService), cfg =>
{
cfg.Timeout = TimeSpan.FromSeconds(10);
cfg.BaseAddress = new Uri("https://api.openweathermap.org");
});
// Using WeatherService class:
private readonly HttpClient _httpClient;
public WeatherService(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient(nameof(WeatherService));
}
// We can create a logging Filter on Program.cs like
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddFilter((_, category, _) => !category.StartsWith($"System.Net.Http.HttpClient.{nameof(WeatherService)}"));
})
注册为 services.AddHttpClient<WeatherService>
将得到相同的类别名称进行过滤。
但我还是觉得有点麻烦...不使用 Serilog
,你能分享一下拒绝它的原因吗?
我有一个自己的库,它通过 http 客户端公开运行状况检查实现:
在我的库中的 StartupExtensions 中:
services.AddHttpClient(Consts.HealthChecksHttpClientName, c =>
{
c.BaseAddress = new Uri(options.BaseUrl);
c.DefaultRequestHeaders.Add("Connection", "close");
});
如何关闭健康检查的默认日志记录 url?
我知道我可以禁用所有日志:
services.RemoveAll<IHttpMessageHandlerBuilderFilter>();
我不想从不属于该库的所有 http 客户端中删除所有日志 - 只想为我的 http 客户端禁用单个 url。
是否只针对指定的HttpClient覆盖?
我不想使用 Serilog
- 仅使用标准 Microsoft.Extensions.Logging
您的日志记录过滤器应该取决于我们如何使用 HttpClient
。例如,像这样使用
using var weatherHttpClient = new HttpClient()
// make using here
AFAIK,这种情况下无法将日志记录与 HttpClient
分开。
如果我们通过 DI 使用 HttpClient
,我们可以制作这样的过滤器。
// Register with DI. I'm just a fan of named HttpClient, use your register as wished
services.AddHttpClient(nameof(WeatherService), cfg =>
{
cfg.Timeout = TimeSpan.FromSeconds(10);
cfg.BaseAddress = new Uri("https://api.openweathermap.org");
});
// Using WeatherService class:
private readonly HttpClient _httpClient;
public WeatherService(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient(nameof(WeatherService));
}
// We can create a logging Filter on Program.cs like
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddFilter((_, category, _) => !category.StartsWith($"System.Net.Http.HttpClient.{nameof(WeatherService)}"));
})
注册为 services.AddHttpClient<WeatherService>
将得到相同的类别名称进行过滤。
但我还是觉得有点麻烦...不使用 Serilog
,你能分享一下拒绝它的原因吗?