HTTP:IHttpClientFactory 创建的 HttpClient 实例记录整数状态代码

IHttpClientFactory 创建的 HttpClient 实例将 HTTP 状态代码记录为整数而不是状态代码名称。

引入的版本

5.0 预览版 1

旧行为

日志记录使用 HTTP 状态代码的文本说明。 考虑以下日志消息:

Received HTTP response after 56.0044ms - OK
End processing HTTP request after 70.0862ms - OK

新行为

日志记录使用 HTTP 状态代码的整数值。 考虑以下日志消息:

Received HTTP response after 56.0044ms - 200
End processing HTTP request after 70.0862ms - 200

更改原因

此日志记录的原始行为与始终使用整数值的 ASP.NET Core 的其他部分不一致。 不一致使通过结构化日志记录系统(如 Elasticsearch)查询日志变得困难。 有关详细信息,请参阅 dotnet/extensions#1549

使用整数值比文本更灵活,因为它允许对值范围进行查询。

考虑添加另一个日志值来捕获整数状态代码。 遗憾的是,这样做会导致与 ASP.NET Core 的其余部分不一致。 HttpClient 日志记录和 HTTP 服务器/托管日志记录使用相同的 StatusCode 密钥名称。

最佳选择是更新日志记录查询,以使用状态代码的整数值。 这种方式可能会导致跨多个 ASP.NET Core 版本编写查询时遇到一些困难。 但是出于此目的使用整数查询日志会更加灵活。

如果需要强制与旧行为兼容并使用文本状态代码,请将 IHttpClientFactory 日志记录替换为你自己的日志记录:

  1. 将以下类的 .NET Core 3.1 版本复制到项目中:

  2. 重命名类,以避免与 Microsoft.Extensions.Http NuGet 包中的公共类型发生冲突。

  3. 在项目的 Startup.ConfigureServices 方法中,将 LoggingHttpMessageHandlerBuilderFilter 的内置实现替换为自己的实现。 例如:

    public void ConfigureServices(IServiceCollection services)
    {
        // Other service registrations go first. Code omitted for brevity.
    
        // Place the following after all AddHttpClient registrations.
        services.RemoveAll<IHttpMessageHandlerBuilderFilter>();
    
        services.AddSingleton<IHttpMessageHandlerBuilderFilter,
                              MyLoggingHttpMessageHandlerBuilderFilter>();
    }
    

受影响的 API

System.Net.Http.HttpClient