Rejestrowanie klienta HTTP na platformie .NET

Podczas tworzenia aplikacji, które wysyłają żądania HTTP, rejestrowanie ustrukturyzowane ułatwia monitorowanie, rozwiązywanie problemów i analizowanie ruchu wychodzącego. Rozszerzenie AddExtendedHttpClientLogging zapewnia rozszerzone rejestrowanie dla wszystkich klientów HTTP utworzonych za pomocą IHttpClientFactory, z wbudowaną obsługą dla:

  • Rejestrowanie konfigurowalne — kontrolowanie rejestrowanych elementów (nagłówki, treść, parametry zapytania, parametry trasy)
  • Redaction danych — stosowanie zasad klasyfikacji i redakcji danych w celu zachowania prywatności i zgodności
  • Wzbogacanie dzienników — dodawanie kontekstu niestandardowego do dzienników żądań HTTP
  • Minimalne obciążenie — funkcje, które można włączyć, z ustawieniami domyślnymi zoptymalizowanymi pod kątem wydajności

Włącz rozszerzone rejestrowanie klienta HTTP przez wywołanie AddExtendedHttpClientLogging metody rozszerzenia. Spowoduje to zastąpienie domyślnego rejestratora klienta HTTP rozszerzonym rejestratorem obsługującym szczegółowe funkcje konfiguracji i zgodności danych.

Dodawanie pakietu

dotnet add package Microsoft.Extensions.Http.Diagnostics

Lub, jeśli używasz zestawu .NET 10+ SDK:

dotnet package add Microsoft.Extensions.Http.Diagnostics

Aby uzyskać więcej informacji, zobacz dotnet package add or Manage package dependencies in .NET applications (Dodawanie pakietów dotnet lub zarządzanie zależnościami pakietów w aplikacjach platformy .NET).

Włącz rejestrowanie klienta HTTP

Aby dodać ulepszone rejestrowanie klienta HTTP w aplikacji, wywołaj metodę rozszerzenia AddExtendedHttpClientLogging podczas konfigurowania usług.

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();

Ta rejestracja dodaje rozszerzony rejestrator do wszystkich klientów HTTP utworzonych za pomocą metody IHttpClientFactory, zastępując domyślny rejestrator takim, który wspiera zaawansowaną konfigurację.

Ważne

AddExtendedHttpClientLogging() Usuwa wszystkie inne rejestratory, w tym domyślny zarejestrowany za pośrednictwem AddDefaultLogger(). Ten proces zapewnia spójne zachowanie logowania we wszystkich klientach HTTP.

Ważne

Należy zarejestrować usługi redakcji, wywołując AddRedaction w pakiecie Microsoft.Extensions.Compliance.Redaction. Funkcja rejestrowania klienta HTTP domyślnie redaguje poufne informacje (takie jak parametry trasy) i wymaga dostawcy narzędzi do redakcji w kontenerze do wstrzykiwania zależności.

Stosowanie rejestrowania do określonych klientów HTTP

Rozszerzone rejestrowanie można również zastosować do określonych klientów HTTP nazwanych lub o określonym typie przy użyciu IHttpClientBuilder metod rozszerzenia.

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();    

W przypadku korzystania z IHttpClientBuilder przeciążeń rejestrowanie jest stosowane tylko do tego konkretnego klienta, a nie globalnie.

Wyświetlanie wzbogaconych danych dziennika

Ulepszone rejestrowanie klienta HTTP dodaje informacje do dzienników przy użyciu wzbogacania, co oznacza, że dane są dodawane jako tagi do dzienników strukturalnych, a nie do komunikatu konsoli. Aby wyświetlić wzbogacone informacje, użyj dostawcy rejestrowania obsługującego dzienniki ustrukturyzowane.

Aby przeprowadzić szybkie testowanie, użyj polecenia AddJsonConsole , aby wydrukować dzienniki ustrukturyzowane w konsoli:

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");
    });

W przypadku scenariuszy produkcyjnych rozważ użycie dostawców rejestrowania strukturalnego, takich jak Application Insights, Seq lub Elasticsearch, które mogą wykonywać zapytania i wizualizować wzbogacone dane tagów.

Konfigurowanie opcji rejestrowania

Konfigurujesz rejestrowanie klienta HTTP za pomocą klasy przy użyciu wzorca opcji standardowych . Opcje można skonfigurować w kodzie lub powiązać z konfiguracją (na przykład appsettings.json).

Konfiguracja z delegatem

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");
});

Konfigurowanie z poziomu 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"));

Opcje konfiguracji

Klasa LoggingOptions udostępnia następujące opcje konfiguracji:

Opcje rejestrowania podstawowego

Option Typ Default Opis
LogRequestStart bool false Gdy trueprogram rejestruje żądanie przed rozpoczęciem przetwarzania. Gdy false program rejestruje pojedynczy zapis z danymi żądania i odpowiedzi.
LogBody bool false Umożliwia logowanie treści żądań HTTP i odpowiedzi. Ostrzeżenie: Unikaj włączania w środowisku produkcyjnym, ponieważ może to spowodować wyciek poufnych informacji.
BodySizeLimit int 32 768 (≈32 KB) Maksymalna liczba bajtów do odczytu z treści żądania lub odpowiedzi. Utrzymuj poniżej 85 000 bajtów, aby uniknąć alokacji dużej sterty obiektów.
BodyReadTimeout TimeSpan 1 sekunda Maksymalny czas oczekiwania podczas odczytywania żądania lub treści odpowiedzi. Musi należeć do przedziału od 1 milisekund do 1 minuty.
RequestBodyContentTypes ISet<string> Pusty Typy zawartości żądań HTTP uznawane za tekst i kwalifikujące się do serializacji.
ResponseBodyContentTypes ISet<string> Pusty Typy zawartości odpowiedzi HTTP uważane za tekst i kwalifikujące się do serializacji.

Rejestrowanie parametrów nagłówka i zapytania

Option Typ Default Opis
RequestHeadersDataClasses IDictionary<string, DataClassification> Pusty Nagłówki żądań HTTP do rejestrowania z klasyfikacją danych do redakcji. Jeśli jest pusty, żadne nagłówki żądań nie są rejestrowane.
ResponseHeadersDataClasses IDictionary<string, DataClassification> Pusty Nagłówki odpowiedzi HTTP do rejestrowania przy użyciu klasyfikacji danych na potrzeby redaction. Jeśli jest pusty, żadne nagłówki odpowiedzi nie są rejestrowane.
RequestQueryParametersDataClasses IDictionary<string, DataClassification> Pusty Parametry zapytania HTTP do logowania według klasyfikacji danych. Jeśli jest pusty, nie są rejestrowane żadne parametry zapytania. Funkcja eksperymentalna.
LogContentHeaders bool false Włącz rejestrowanie nagłówków zawartości HTTP (na przykład Content-Type). Włącz tylko wtedy, gdy nagłówki zawartości znajdują się w elemecie RequestHeadersDataClasses lub ResponseHeadersDataClasses. Funkcja eksperymentalna.

Rejestrowanie parametrów ścieżki i trasy

Option Typ Default Opis
RequestPathLoggingMode OutgoingPathLoggingMode Formatted Jak zarejestrować wychodzącą ścieżkę żądania HTTP. Stosowane tylko wtedy, gdy RequestPathParameterRedactionMode nie ma None.
RequestPathParameterRedactionMode HttpRouteParameterRedactionMode Strict Jak zredagować parametry ścieżki w wychodzących żądaniach HTTP.
RouteParameterDataClasses IDictionary<string, DataClassification> Pusty Przekierowanie parametrów do zredagowania z ich odpowiednimi klasyfikacjami danych.

Dodaj wzbogacacze logów

Wzbogacacze dzienników klienta HTTP umożliwiają dodawanie niestandardowych informacji kontekstowych do dzienników klienta HTTP na podstawie żądania, odpowiedzi i wszelkich wyjątków. W przeciwieństwie do ogólnych wzbogacaczy logów, wzbogacacze klientów HTTP są specjalnie przeznaczone dla wychodzących żądań HTTP i mają dostęp do kontekstu specyficznego dla HTTP.

Oto szybki przykład:

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>();

Aby uzyskać szczegółowe informacje na temat tworzenia i używania wzbogacaczy dzienników klienta HTTP, w tym dobre praktyki i zaawansowane scenariusze, zobacz Wzbogacacz dzienników klienta HTTP.

Klasyfikacja i redaction danych

Rejestrowanie klienta HTTP integruje się z funkcjami redakcji danych i klasyfikacji danych w celu ochrony poufnych informacji. Po określeniu DataClassification dla nagłówków, parametrów zapytania lub parametrów trasy, system redagowania stosuje odpowiednie redagowanie na podstawie skonfigurowanych narzędzi redagujących.

Przykład: redagowanie poufnych nagłówków

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);
});

Aby uzyskać więcej informacji na temat konfigurowania redaktorów, zobacz Redakcja danych w .NET.

Redakcja parametru ścieżki i parametru trasy

Domyślnie rejestrowanie klienta HTTP usuwa ścieżki żądań i odpowiedzi w celu ochrony prywatności. Podczas rejestrowania ścieżek żądań HTTP można kontrolować sposób redagowania parametrów trasy przy użyciu RequestPathParameterRedactionMode opcji :

Tryb Opis Example
None Brak utajniania, pełna ścieżka jest zapisana /api/users/12345/orders/67890
Strict Wszystkie parametry ścieżki są redagowane /api/users/{userId}/orders/{orderId}
Loose Tylko parametry w RouteParameterDataClasses są ukryte /api/users/12345/orders/{orderId}

Opcja RequestPathLoggingMode steruje formatem zarejestrowanej ścieżki:

Tryb Opis Example
Formatted Używa formatu szablonu trasy z nazwami parametrów /api/users/{userId}/orders/{orderId}
Structured Ścieżka logów i parametry są oddzielne Ścieżka: /api/users/*/orders/*, Params: {userId, orderId}

Przykład: wyłączenie redagowania ścieżki

Aby zarejestrować pełne, nieredagowane ścieżki (na przykład w środowiskach deweloperskich), ustaw wartość RequestPathParameterRedactionModeNone:

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

Ostrzeżenie

Wyłączenie funkcji zaciemniania ścieżek może spowodować uwidocznienie poufnych informacji w zapisach dzienników. Używaj HttpRouteParameterRedactionMode.None tylko w programach programistycznych lub wtedy, gdy niektóre ścieżki nie zawierają poufnych danych.

Zagadnienia dotyczące wydajności

Ulepszone rejestrowanie klienta HTTP zostało zaprojektowane z myślą o wydajności, ale należy wziąć pod uwagę następujące kompromisy:

  • Rejestrowanie treści: włączenie LogBody dodaje nakład pracy na potrzeby buforowania i odczytywania treści żądań/odpowiedzi. Użyj funkcji BodySizeLimit i BodyReadTimeout , aby kontrolować użycie zasobów.
  • Rejestrowanie nagłówków: Rejestruj tylko te nagłówki, które są potrzebne. Puste RequestHeadersDataClasses i ResponseHeadersDataClasses unikają obciążenia przetwarzania nagłówka.
  • Wzbogacacze: każdy zarejestrowany wzbogacacz jest wywoływany dla każdego żądania. Zachowaj lekką logikę wzbogacania.
  • Redakcja: Klasyfikacja danych i redakcja dodaje minimalne obciążenie, ale skalują się w zależności od liczby sklasyfikowanych elementów.

Tip

W środowiskach produkcyjnych zacznij od minimalnego rejestrowania (bez treści, ograniczonych nagłówków) i włącz dodatkowe rejestrowanie tylko na potrzeby rozwiązywania problemów.

Zobacz także