Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Při vytváření aplikací, které vytvářejí požadavky HTTP, vám strukturované protokolování pomůže monitorovat, řešit potíže a analyzovat odchozí provoz. Rozšíření AddExtendedHttpClientLogging poskytuje rozšířené protokolování pro všechny klienty HTTP vytvořené pomocí IHttpClientFactory, s integrovanou podporou pro:
- Konfigurovatelné protokolování – řízení toho, co se protokoluje (hlavičky, tělo, parametry dotazu, parametry trasy)
- Redakce dat – Použití zásad klasifikace a redigování dat kvůli ochraně soukromí a dodržování právních předpisů
- Obohacení záznamů – Přidávání vlastního kontextu do záznamů HTTP požadavků
- Minimální režie – Funkce přihlášení s výchozími nastaveními orientovanými na výkon
Povolte rozšířené protokolování HTTP klienta voláním metody rozšíření AddExtendedHttpClientLogging. Tím se nahradí výchozí protokolovací nástroj klienta HTTP rozšířeným protokolovacím nástrojem, který podporuje jemně odstupňovanou konfiguraci a funkce dodržování předpisů dat.
Přidání balíčku
dotnet add package Microsoft.Extensions.Http.Diagnostics
Nebo pokud používáte sadu .NET 10+ SDK:
dotnet package add Microsoft.Extensions.Http.Diagnostics
Další informace naleznete v tématu dotnet package add nebo Správa závislostí balíčků v aplikacích .NET.
Zapnutí protokolování HTTP klienta
Pokud chcete do aplikace přidat rozšířené protokolování klienta HTTP, zavolejte rozšiřující metodu AddExtendedHttpClientLogging při konfiguraci služeb:
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();
Tato registrace přidá vylepšený protokolovací nástroj pro všechny klienty HTTP vytvořené prostřednictvím IHttpClientFactory, který nahradí výchozí protokolovací nástroj a podporuje pokročilou konfiguraci.
Důležité
AddExtendedHttpClientLogging() odebere všechny ostatní protokolovače, včetně výchozího, který je registrován prostřednictvím AddDefaultLogger(). Tím se zajistí konzistentní chování protokolování ve všech klientech HTTP.
Důležité
Služby redakce jsou nutné registrovat voláním AddRedaction z balíčku Microsoft.Extensions.Compliance.Redaction. Funkce protokolování klienta HTTP ve výchozím nastavení rediguje citlivé informace (například parametry trasy) a vyžaduje poskytovatele redaktoru v kontejneru pro injektáž závislostí.
Použít protokolování pro konkrétní klienty HTTP
Rozšířené protokolování můžete použít také pro konkrétní pojmenované nebo typované klienty HTTP pomocí IHttpClientBuilder rozšiřujících metod:
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();
Při používání přetížení IHttpClientBuilder se protokolování aplikuje pouze na tohoto konkrétního klienta, nikoli globálně.
Zobrazení obohacených dat protokolu
Vylepšené protokolování klienta HTTP přidává informace do protokolů pomocí obohacení, což znamená, že data se přidávají jako značky do strukturovaných protokolů, nikoli do zprávy konzoly. Pokud chcete zobrazit rozšířené informace, použijte zprostředkovatele protokolování, který podporuje strukturované protokoly.
K rychlému testování použijte AddJsonConsole k tisku strukturovaných protokolů do konzoly:
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");
});
V produkčních scénářích zvažte použití poskytovatelů strukturovaného protokolování, jako je Application Insights, Seq nebo Elasticsearch, které můžou dotazovat a vizualizovat rozšířená data značek.
Konfigurace možností protokolování
Protokolování klienta HTTP nakonfigurujete prostřednictvím LoggingOptions třídy pomocí standardního vzoru možností. Můžete nakonfigurovat možnosti v kódu nebo je svázat z konfigurace (například appsettings.json).
Konfigurace s delegátem
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");
});
Konfigurace z 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"));
Možnosti konfigurace
Třída LoggingOptions poskytuje následující možnosti konfigurace:
Základní možnosti logování
| Možnost | Typ | Výchozí | Description |
|---|---|---|---|
LogRequestStart |
bool |
false |
Když je true zaznamenán požadavek před zahájením zpracování. Když je false zaznamenána jedna položka s daty požadavku i odpovědi. |
LogBody |
bool |
false |
Umožňuje protokolovat těla HTTP požadavků a odpovědí. Upozornění: Vyhněte se povolení v produkčním prostředí, protože by mohlo dojít k úniku citlivých informací. |
BodySizeLimit |
int |
32 768 (≈32 kB) | Maximální počet bajtů ke čtení z textu požadavku nebo odpovědi Udržujte pod 85 000 bajtů, abyste se vyhnuli alokaci velkého objektového zásobníku. |
BodyReadTimeout |
TimeSpan |
1 sekunda | Maximální doba čekání při čtení požadavku nebo textu odpovědi Musí být mezi 1 milisekundou a 1 minutou. |
RequestBodyContentTypes |
ISet<string> |
Prázdný | Typy obsahu požadavku HTTP se považují za text a mají nárok na serializaci. |
ResponseBodyContentTypes |
ISet<string> |
Prázdný | Typy obsahu odpovědi HTTP se považují za text a mají nárok na serializaci. |
Protokolování hlaviček a parametrů dotazu
| Možnost | Typ | Výchozí | Description |
|---|---|---|---|
RequestHeadersDataClasses |
IDictionary<string, DataClassification> |
Prázdný | Hlavičky požadavku HTTP, které se mají protokolovat s jejich klasifikacemi dat pro redigování. Pokud jsou prázdné, nebudou zaprotokolovány žádné hlavičky požadavků. |
ResponseHeadersDataClasses |
IDictionary<string, DataClassification> |
Prázdný | Hlavičky odpovědí HTTP pro protokolování s jejich klasifikacemi dat pro redakce. Pokud je prázdné, nebudou zaprotokolovány žádné hlavičky odpovědi. |
RequestQueryParametersDataClasses |
IDictionary<string, DataClassification> |
Prázdný | Parametry dotazu požadavku HTTP, které se mají protokolovat s jejich klasifikacemi dat. Pokud jsou prázdné, nejsou zaprotokolovány žádné parametry dotazu. Experimentální funkce |
LogContentHeaders |
bool |
false |
Povolte protokolování hlaviček obsahu HTTP (například Content-Type). Povolit pouze v případě, že záhlaví obsahu jsou v RequestHeadersDataClasses nebo ResponseHeadersDataClasses. Experimentální funkce |
Protokolování parametrů cesty a směrování
| Možnost | Typ | Výchozí | Description |
|---|---|---|---|
RequestPathLoggingMode |
OutgoingPathLoggingMode |
Formatted |
Jak protokolovat cestu odchozího požadavku HTTP. Použije se pouze v případech, kdy RequestPathParameterRedactionMode není None. |
RequestPathParameterRedactionMode |
HttpRouteParameterRedactionMode |
Strict |
Jak redigovat parametry cesty v odchozích HTTP požadavcích. |
RouteParameterDataClasses |
IDictionary<string, DataClassification> |
Prázdný | Směrujte parametry pro redakci s odpovídajícími klasifikacemi dat. |
Přidání obohacovačů protokolů
Rozšíření protokolů klienta HTTP umožňují přidat vlastní kontextové informace do protokolů klienta HTTP na základě požadavku, odpovědi a jakýchkoli výjimek. Na rozdíl od rozšíření protokolů pro obecné účely cílí klientská rozšíření HTTP konkrétně na odchozí požadavky HTTP a mají přístup k kontextu specifickému pro HTTP.
Tady je rychlý příklad:
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>();
Podrobné informace o vytváření a používání rozšiřujících protokolů klienta HTTP, včetně osvědčených postupů a pokročilých scénářů, najdete v tématu o rozšiřování protokolů klienta HTTP.
Klasifikace a redakce dat
Protokolování klienta HTTP se integruje s redakcí dat a funkcemi klasifikace dat za účelem ochrany citlivých informací. Když zadáte DataClassification pro hlavičky, parametry dotazu nebo parametry trasy, systém redakce použije odpovídající redakce na základě vašich nakonfigurovaných redaktorů.
Příklad: Redakce citlivých záhlaví
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);
});
Další informace o konfiguraci redaktorů naleznete v tématu Redaction v .NET.
Redaction parametru cesty a trasy
Ve výchozím nastavení klient protokolu HTTP zakrývá cesty požadavků a odpovědí k ochraně soukromí. Při protokolování cest požadavků HTTP můžete řídit, jak se parametry trasy redakčně zpracovávají, pomocí RequestPathParameterRedactionMode této možnosti:
| Režim | Description | Example |
|---|---|---|
None |
Žádná redakce, úplná cesta se protokoluje. | /api/users/12345/orders/67890 |
Strict |
Všechny parametry cesty jsou redigovány. | /api/users/{userId}/orders/{orderId} |
Loose |
Pouze parametry v RouteParameterDataClasses jsou redigovány |
/api/users/12345/orders/{orderId} |
Možnost RequestPathLoggingMode řídí formát protokolované cesty:
| Režim | Description | Example |
|---|---|---|
Formatted |
Používá formát šablony trasy s názvy parametrů. | /api/users/{userId}/orders/{orderId} |
Structured |
Protokoluje cestu a parametry samostatně. | Cesta: /api/users/*/orders/*, Parametry: {userId, orderId} |
Příklad: Zakázání redakce cesty
Pokud chcete protokolovat úplné, nereactované cesty (například ve vývojových prostředích), nastavte RequestPathParameterRedactionMode na None:
builder.Services.AddExtendedHttpClientLogging(options =>
{
// Disable redaction of request/response paths
options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});
Upozornění
Zakázání skrytí cest může v protokolech odhalit citlivé informace. Používejte HttpRouteParameterRedactionMode.None pouze při vývoji nebo pokud jste si jisti, že cesty neobsahují citlivá data.
Důležité informace o výkonu
Vylepšené protokolování klienta HTTP je navržené s ohledem na výkon, ale existují kompromisy, které je potřeba zvážit:
-
Protokolování textu: Povolení
LogBodypřidává režii pro ukládání do vyrovnávací paměti a čtení těla požadavků a odpovědí. PoužijteBodySizeLimitaBodyReadTimeoutk řízení využití prostředků. -
Protokolování hlaviček: Potřebujete jenom hlavičky protokolu. Prázdné
RequestHeadersDataClassesaResponseHeadersDataClassespomáhají vyhnout se režijním nákladům na zpracování hlaviček. - Rozšiřování: Každý zaregistrovaný rozšiřující kód se volá pro každý požadavek. Udržujte logiku rozšiřování odlehčenou.
- Redakce: Klasifikace dat a redakce přidávají minimální režii, ale jejich škálování závisí na počtu klasifikovaných položek.
Návod
V produkčních prostředích začněte s minimálním protokolováním (bez textu, omezených hlaviček) a povolte další protokolování pouze pro řešení potíží.