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

HttpClient 创建的 IHttpClientFactory 实例将 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. 在项目的 LoggingHttpMessageHandlerBuilderFilter 方法中,将 Startup.ConfigureServices 的内置实现替换为自己的实现。 例如:

    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