HTTP:IHttpClientFactory ログの整数状態コードによって作成された HttpClient インスタンス

IHttpClientFactory によって作成された HttpClient インスタンスでは、HTTP 状態コードが、状態コード名を付加するのではなく、整数としてログに記録されます。

導入されたバージョン

5.0 Preview 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