次の方法で共有


.NET での HTTP クライアント のログ記録

HTTP 要求を行うアプリケーションを構築する場合、構造化ログは送信トラフィックの監視、トラブルシューティング、分析に役立ちます。 AddExtendedHttpClientLogging拡張機能では、IHttpClientFactoryで作成されたすべての HTTP クライアントのログ記録が強化され、次の機能が組み込まれています。

  • 構成可能なログ 記録 - ログに記録される内容 (ヘッダー、本文、クエリ パラメーター、ルート パラメーター) を制御する
  • データの編集 - プライバシーとコンプライアンスのためにデータ分類と編集ポリシーを適用する
  • ログ エンリッチメント - HTTP 要求ログにカスタム コンテキストを追加する
  • 最小限のオーバーヘッド - パフォーマンスを意識した既定値を使用したオプトイン機能

AddExtendedHttpClientLogging拡張メソッドを呼び出して、拡張 HTTP クライアントのログ記録を有効にします。 これにより、既定の HTTP クライアント ロガーが、きめ細かな構成とデータ コンプライアンス機能をサポートする拡張ロガーに置き換えられます。

パッケージを追加する

dotnet add package Microsoft.Extensions.Http.Diagnostics

または、.NET 10+ SDK を使用している場合:

dotnet package add Microsoft.Extensions.Http.Diagnostics

詳細については、「.NET アプリケーションでの dotnet パッケージの追加 または パッケージの依存関係の管理」を参照してください。

HTTP クライアント のログ記録を有効にする

拡張 HTTP クライアント ログをアプリケーションに追加するには、サービスを構成するときに AddExtendedHttpClientLogging 拡張メソッドを呼び出します。

using Microsoft.Extensions.DependencyInjection;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Register redaction services (required)
builder.Services.AddRedaction();

// Add enhanced HTTP client logging
builder.Services.AddExtendedHttpClientLogging();

// Add your HTTP clients
builder.Services.AddHttpClient<MyApiClient>();

using IHost host = builder.Build();

await host.RunAsync();

この登録により、 IHttpClientFactoryを使用して作成されたすべての HTTP クライアントに拡張ロガーが追加され、既定のロガーが高度な構成をサポートするものに置き換えます。

Important

AddExtendedHttpClientLogging() は、 AddDefaultLogger()を介して登録された既定のロガーを含め、他のすべてのロガーを削除します。 これにより、すべての HTTP クライアントで一貫したログ動作が保証されます。

Important

AddRedactionパッケージからMicrosoft.Extensions.Compliance.Redactionを呼び出して、編集サービスを登録しなければなりません。 HTTP クライアント ログ機能は、既定で機密情報 (ルート パラメーターなど) をマスキングし、依存関係挿入コンテナーにはリダクター プロバイダーが必要です。

特定の HTTP クライアントにログ記録を適用する

IHttpClientBuilder拡張メソッドを使用して、特定の名前付きまたは型指定された HTTP クライアントに拡張ログを適用することもできます。

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

// Register redaction services (required)
builder.Services.AddRedaction();

// Apply to a named client
builder.Services.AddHttpClient("MyNamedClient")
    .AddExtendedHttpClientLogging();

// Apply to a typed client with configuration
builder.Services.AddHttpClient<MyApiClient>()
    .AddExtendedHttpClientLogging(options =>
    {
        options.LogBody = true;
        options.ResponseBodyContentTypes.Add("application/json");
    });

using IHost host = builder.Build();

await host.RunAsync();    

IHttpClientBuilderオーバーロードを使用する場合、ログ記録はグローバルではなく、その特定のクライアントにのみ適用されます。

強化されたログ データの表示

拡張 HTTP クライアント ログは、 エンリッチメントを使用してログに情報を追加します。つまり、データはコンソール メッセージではなく構造化ログのタグとして追加されます。 エンリッチされた情報を表示するには、構造化ログをサポートするログ プロバイダーを使用します。

簡単なテストを行うには、 AddJsonConsole を使用して、構造化されたログをコンソールに出力します。

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);

builder.Logging.AddJsonConsole();

builder.Services.AddRedaction();

builder.Services.AddHttpClient("MyClient")
    .AddExtendedHttpClientLogging(options =>
    {
        options.LogBody = true;
        options.ResponseBodyContentTypes.Add("application/json");
    });

運用環境のシナリオでは、エンリッチされたタグ データを照会して視覚化できる Application Insights、Seq、Elasticsearch などの構造化ログ プロバイダーの使用を検討してください。

ログ オプションを構成する

LoggingOptionsを使用して、 クラスを介して HTTP クライアント のログ記録を構成します。 コードでオプションを構成したり、構成からバインドしたりできます (たとえば、 appsettings.json)。

デリゲートを使用して構成する

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Log request headers with data classification
    options.RequestHeadersDataClasses.Add("User-Agent", DataClassification.None);
    options.RequestHeadersDataClasses.Add("Authorization", DataClassification.Unknown);

    // Log response headers
    options.ResponseHeadersDataClasses.Add("Content-Type", DataClassification.None);

    // Enable request/response body logging (use carefully in production)
    options.LogBody = true;
    options.BodySizeLimit = 4096; // Limit to 4KB
    options.RequestBodyContentTypes.Add("application/json");
    options.ResponseBodyContentTypes.Add("application/json");
});

appsettings.json から構成する

{
  "HttpClientLogging": {
    "LogRequestStart": false,
    "LogBody": false,
    "BodySizeLimit": 32768,
    "BodyReadTimeout": "00:00:01",
    "RequestHeadersDataClasses": {
      "User-Agent": "None",
      "Content-Type": "None"
    },
    "ResponseHeadersDataClasses": {
      "Content-Type": "None"
    },
    "RequestPathLoggingMode": "Formatted",
    "RequestPathParameterRedactionMode": "Strict"
  }
}
builder.Services.AddExtendedHttpClientLogging(
    builder.Configuration.GetSection("HttpClientLogging"));

構成オプション

LoggingOptions クラスには、次の構成オプションがあります。

基本的なログ オプション

Option タイプ 既定値 Description
LogRequestStart bool false true場合は、処理を開始する前に要求をログに記録します。 falseすると、要求データと応答データの両方を含む 1 つのエントリがログに記録されます。
LogBody bool false HTTP 要求と応答本文のログ記録を有効にします。 警告: 機密情報が漏えいする可能性があるため、運用環境では有効にしないでください。
BodySizeLimit int 32,768 (≈32 KB) 要求または応答本文から読み取る最大バイト数。 大きなオブジェクト ヒープの割り当てを回避するには、85,000 バイト未満にしてください。
BodyReadTimeout TimeSpan 1 秒 要求または応答本文を読み取るときに待機する最大時間。 1 ミリ秒から 1 分の間である必要があります。
RequestBodyContentTypes ISet<string> 空っぽ HTTP 要求コンテンツ タイプは、テキストと見なされ、シリアル化の対象と見なされます。
ResponseBodyContentTypes ISet<string> 空っぽ HTTP 応答コンテンツ タイプは、テキストと見なされ、シリアル化の対象と見なされます。

ヘッダーとクエリ パラメーターのログ記録

Option タイプ 既定値 Description
RequestHeadersDataClasses IDictionary<string, DataClassification> 空っぽ 再処理のためにデータ分類を使用してログに記録する HTTP 要求ヘッダー。 空の場合、要求ヘッダーはログに記録されません。
ResponseHeadersDataClasses IDictionary<string, DataClassification> 空っぽ 編集のためにデータ分類を使用してログに記録する HTTP 応答ヘッダー。 空の場合、応答ヘッダーはログに記録されません。
RequestQueryParametersDataClasses IDictionary<string, DataClassification> 空っぽ データ分類を使用してログに記録する HTTP 要求クエリ パラメーター。 空の場合、クエリ パラメーターはログに記録されません。 試験段階の機能。
LogContentHeaders bool false HTTP コンテンツ ヘッダー ( Content-Type など) のログ記録を有効にします。 コンテンツ ヘッダーが RequestHeadersDataClasses または ResponseHeadersDataClassesにある場合にのみ有効にします。 試験段階の機能。

パスとルートのパラメーターのログ記録

Option タイプ 既定値 Description
RequestPathLoggingMode OutgoingPathLoggingMode Formatted 送信 HTTP 要求パスをログに記録する方法。 RequestPathParameterRedactionModeNoneされていない場合にのみ適用されます。
RequestPathParameterRedactionMode HttpRouteParameterRedactionMode Strict 送信 HTTP 要求のパス パラメーターを編集する方法。
RouteParameterDataClasses IDictionary<string, DataClassification> 空っぽ 対応するデータ分類で、パラメーターを修正するためのルーティングを行う。

ログ エンリッチャーを追加する

HTTP クライアント ログ エンリッチャーを使用すると、要求、応答、および例外に基づいて、カスタム コンテキスト情報を HTTP クライアント ログに追加できます。 汎用ログ エンリッチャーとは異なり、HTTP クライアント エンリッチャーは特に送信 HTTP 要求を対象とし、HTTP 固有のコンテキストにアクセスできます。

簡単な例を次に示します。

public class CustomHttpLogEnricher : IHttpClientLogEnricher
{
    public void Enrich(IEnrichmentTagCollector collector,
        HttpRequestMessage request, HttpResponseMessage? response, Exception? exception)
    {
        // Add tags based on the exception (if available)
        if (exception is not null)
        {
            collector.Add("error_type", exception.GetType().Name);
        }
    }
}

// Register the enricher
builder.Services.AddHttpClientLogEnricher<CustomHttpLogEnricher>();

ベスト プラクティスや高度なシナリオなど、HTTP クライアント ログ エンリッチャーの作成と使用の詳細については、 HTTP クライアント ログ エンリッチャーを参照してください。

データ分類と編集

HTTP クライアント ログは、機密情報を保護するために 、データの編集 機能と データ分類 機能と統合されます。 ヘッダー、クエリパラメーター、またはルートパラメーターに DataClassification を指定すると、設定された編集者に基づいて、編集システムによって適切なマスキングが適用されます。

例: 機密性の高いヘッダーの編集

using Microsoft.Extensions.Compliance.Classification;

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Public headers - no redaction
    options.RequestHeadersDataClasses.Add("User-Agent", DataClassification.None);
    options.RequestHeadersDataClasses.Add("Content-Type", DataClassification.None);

    // Sensitive headers - apply redaction
    options.RequestHeadersDataClasses.Add("Authorization", DataClassification.Unknown);
    options.RequestHeadersDataClasses.Add("X-API-Key", DataClassification.Unknown);
});

編集プログラムの構成の詳細については、「 .NET でのデータの編集」を参照してください。

パスとルートのパラメーターの編集

既定では、HTTP クライアントログは、プライバシーを保護するために要求と応答のパスを編集します。 HTTP 要求パスをログに記録する場合は、 RequestPathParameterRedactionMode オプションを使用してルート パラメーターの編集方法を制御できます。

モード Description
None 編集なし、完全なパスがログに記録される /api/users/12345/orders/67890
Strict すべてのパス パラメーターが編集されます /api/users/{userId}/orders/{orderId}
Loose RouteParameterDataClasses内のパラメーターのみが編集されます /api/users/12345/orders/{orderId}

RequestPathLoggingMode オプションは、ログに記録されるパスの形式を制御します。

モード Description
Formatted パラメーター名でルート テンプレート形式を使用する /api/users/{userId}/orders/{orderId}
Structured パスとパラメーターを個別にログに記録する パス: /api/users/*/orders/*、パラメーター: {userId, orderId}

例: パスの編集を無効にする

完全なパス (開発環境など) をログに記録するには、 RequestPathParameterRedactionModeNone に設定します。

builder.Services.AddExtendedHttpClientLogging(options =>
{
    // Disable redaction of request/response paths
    options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});

注意事項

パスの編集を無効にすると、ログ内の機密情報が公開される可能性があります。 開発中または特定のパスに機密データが含まれていない場合にのみ、 HttpRouteParameterRedactionMode.None を使用します。

パフォーマンスに関する考慮事項

拡張 HTTP クライアント のログ記録はパフォーマンスを念頭に置いて設計されていますが、考慮すべきトレードオフがあります。

  • 本文のログ記録: LogBody を有効にすると、要求/応答本文のバッファリングと読み取りのオーバーヘッドが増加します。 リソースの使用状況を制御するには、 BodySizeLimitBodyReadTimeout を使用します。
  • ヘッダー ログ: 必要なログ ヘッダーのみ。 空の RequestHeadersDataClassesResponseHeadersDataClasses により、ヘッダー処理のオーバーヘッドを回避します。
  • エンリッチャー: 登録された各エンリッチャーは、すべての要求に対して呼び出されます。 エンリッチャー ロジックを軽量に保ちます。
  • 編集: データ分類と編集によりオーバーヘッドは最小限に抑えられますが、分類された項目の数に応じてスケーリングされます。

ヒント

運用環境では、最小限のログ記録 (本文なし、制限付きヘッダー) から開始し、トラブルシューティングのためにのみ追加のログ記録を有効にします。

こちらも参照ください