Protokolování klienta HTTP v .NET

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í LogBody přidává režii pro ukládání do vyrovnávací paměti a čtení těla požadavků a odpovědí. Použijte BodySizeLimit a BodyReadTimeout k řízení využití prostředků.
  • Protokolování hlaviček: Potřebujete jenom hlavičky protokolu. Prázdné RequestHeadersDataClasses a ResponseHeadersDataClasses pomá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íží.

Viz také