如何防止通过IHttpClientFactory的HttpClient登录到ILogger?

时间:2018-08-29 18:14:53

标签: asp.net-core asp.net-core-2.0

我正在编写一个自定义的ILoggerProvider,它使用通过配置的HttpClient获得的IHttpClientFactory实例通过HTTP转发日志消息:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
}

当我的ILoggerProvider转发一批日志时,它的HttpClient会生成其他日志消息,然后再转发...导致各种堆栈溢出。

如何仅抑制 在执行转发方法的有限范围内生成的消息,以便可以从HttpClient或其他可能的任何内容中过滤出日志在该范围内记录日志?

2 个答案:

答案 0 :(得分:2)

  

我正在编写一个自定义的ILoggerProvider,它使用通过配置的IHttpClientFactory获得的HttpClient实例通过HTTP转发日志消息:

不要这样做,请使用与工厂无关的另一个HttpClient。

答案 1 :(得分:0)

通过HttpClient创建的IHttpClientFactory的命名实例使用包含这些名称的log categories。发送到该转发提供商的日志可以被过滤掉。

如果这样创建命名的HttpClient

httpClientFactory.CreateClient(nameof(MyForwardingLoggerProvider))))

然后,一种筛选出日志的可能方法是,当此HttpClient实例尝试使用ILogger中的提供者名称创建一个categoryName时,返回一个“ no-op”实例。 :

ILogger ILoggerProvider.CreateLogger(String categoryName)
{
    if (categoryName.StartsWith($"System.Net.Http.HttpClient.{nameof(MyForwardingLoggerProvider)}."))
    {
        // Ignores all logs
        return NoopLogger.Instance;
    }
    else
    {
        // Performs log forwarding
        return new MyForwardingLogger(categoryName);
    }
}