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 要求パスをログに記録する方法。
RequestPathParameterRedactionModeがNoneされていない場合にのみ適用されます。 |
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} |
例: パスの編集を無効にする
完全なパス (開発環境など) をログに記録するには、 RequestPathParameterRedactionMode を None に設定します。
builder.Services.AddExtendedHttpClientLogging(options =>
{
// Disable redaction of request/response paths
options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});
注意事項
パスの編集を無効にすると、ログ内の機密情報が公開される可能性があります。 開発中または特定のパスに機密データが含まれていない場合にのみ、 HttpRouteParameterRedactionMode.None を使用します。
パフォーマンスに関する考慮事項
拡張 HTTP クライアント のログ記録はパフォーマンスを念頭に置いて設計されていますが、考慮すべきトレードオフがあります。
-
本文のログ記録:
LogBodyを有効にすると、要求/応答本文のバッファリングと読み取りのオーバーヘッドが増加します。 リソースの使用状況を制御するには、BodySizeLimitとBodyReadTimeoutを使用します。 -
ヘッダー ログ: 必要なログ ヘッダーのみ。 空の
RequestHeadersDataClassesとResponseHeadersDataClassesにより、ヘッダー処理のオーバーヘッドを回避します。 - エンリッチャー: 登録された各エンリッチャーは、すべての要求に対して呼び出されます。 エンリッチャー ロジックを軽量に保ちます。
- 編集: データ分類と編集によりオーバーヘッドは最小限に抑えられますが、分類された項目の数に応じてスケーリングされます。
ヒント
運用環境では、最小限のログ記録 (本文なし、制限付きヘッダー) から開始し、トラブルシューティングのためにのみ追加のログ記録を有効にします。
こちらも参照ください
.NET