Registrazione cliente HTTP in .NET

Quando si creano applicazioni che effettuano richieste HTTP, la registrazione strutturata consente di monitorare, risolvere i problemi e analizzare il traffico in uscita. L'estensione AddExtendedHttpClientLogging fornisce la registrazione avanzata per tutti i client HTTP creati con IHttpClientFactory, con il supporto predefinito per:

  • Registrazione configurabile : controllare cosa viene registrato (intestazioni, corpo, parametri di query, parametri di route)
  • Redazione dei dati - Applicare politiche di classificazione e redazione dei dati per la privacy e la conformità
  • Arricchimento dei log - Aggiungere un contesto personalizzato ai log delle richieste HTTP
  • Overhead minimo - Funzionalità opzionali con impostazioni predefinite ottimizzate per le prestazioni

Abilita la registrazione avanzata per il client HTTP chiamando il metodo di estensione AddExtendedHttpClientLogging. Questo sostituisce il logger client HTTP predefinito con un logger esteso che supporta funzionalità di configurazione e conformità dei dati con granularità fine.

Aggiungere il pacchetto

dotnet add package Microsoft.Extensions.Http.Diagnostics

Oppure, se stai utilizzando il SDK di .NET 10+

dotnet package add Microsoft.Extensions.Http.Diagnostics

Per altre informazioni, vedere dotnet package add or Manage package dependencies in .NET applications (Aggiungere o gestire le dipendenze dei pacchetti nelle applicazioni .NET).

Abilitare la registrazione client HTTP

Per aggiungere la registrazione avanzata del client HTTP all'applicazione, chiamare il metodo di estensione AddExtendedHttpClientLogging al momento della configurazione dei servizi:

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

Questa registrazione aggiunge un logger avanzato a tutti i client HTTP creati tramite IHttpClientFactory, sostituendo il logger predefinito con uno che supporta la configurazione avanzata.

Importante

AddExtendedHttpClientLogging() rimuove tutti gli altri logger, incluso quello predefinito registrato tramite AddDefaultLogger(). In questo modo si garantisce un comportamento di registrazione coerente in tutti i client HTTP.

Importante

È necessario registrare i servizi di redazione chiamando AddRedaction dal pacchetto Microsoft.Extensions.Compliance.Redaction. La funzionalità di registrazione del client HTTP oscura le informazioni riservate per impostazione predefinita (ad esempio i parametri di route) e richiede un provider di oscuramento nel contenitore di injection delle dipendenze.

Applicare il logging a un client HTTP specifico

È anche possibile applicare il logging avanzato a client HTTP specifici denominati o tipizzati utilizzando i metodi di estensione IHttpClientBuilder.

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

Quando si utilizzano gli IHttpClientBuilder overload, la registrazione viene applicata solo a quel client specifico, non a livello globale.

Visualizzazione dei dati di log arricchiti

La registrazione avanzata del client HTTP aggiunge informazioni ai log usando l'arricchimento, il che significa che i dati vengono aggiunti come tag ai log strutturati anziché al messaggio della console. Per visualizzare le informazioni arricchite, usare un provider di registrazione che supporta i log strutturati.

Per i test rapidi, usare AddJsonConsole per stampare i log strutturati nella console:

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

Per gli scenari di produzione, è consigliabile usare provider di registrazione strutturati come Application Insights, Seq o Elasticsearch in grado di eseguire query e visualizzare i dati dei tag arricchiti.

Configurare le opzioni di registrazione

Si può configurare la registrazione del client HTTP tramite la classe usando il modello di opzioni standard . È possibile configurare le opzioni nel codice o associarle dalla configurazione , ad esempio appsettings.json.

Configurare con un delegato

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

Configurare tramite il file 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"));

Opzioni di configurazione

La LoggingOptions classe fornisce le opzioni di configurazione seguenti:

Opzioni di registrazione di base

Opzione TIPO Predefinito Descrzione
LogRequestStart bool false Quando true, registra la richiesta prima dell'avvio dell'elaborazione. Quando false, registra un'entrata singola con i dati di richiesta e di risposta.
LogBody bool false Abilita la registrazione dei corpi di richiesta e risposta HTTP. Avviso: evitare l'abilitazione nell'ambiente di produzione perché potrebbe causare la perdita di informazioni riservate.
BodySizeLimit int 32.768 (≈32 KB) Numero massimo di byte da leggere dal corpo della richiesta o della risposta. Mantenere al di sotto di 85.000 byte per evitare l'allocazione di heap di oggetti di grandi dimensioni .
BodyReadTimeout TimeSpan 1 secondo Tempo massimo di attesa durante la lettura della richiesta o del corpo della risposta. Deve essere compreso tra 1 millisecondo e 1 minuto.
RequestBodyContentTypes ISet<string> Vuoto Tipi di contenuto della richiesta HTTP considerati testo e idonei per la serializzazione.
ResponseBodyContentTypes ISet<string> Vuoto Tipi di contenuto della risposta HTTP considerati testo e idonei per la serializzazione.

Registrazione dei parametri di intestazione e query

Opzione TIPO Predefinito Descrzione
RequestHeadersDataClasses IDictionary<string, DataClassification> Vuoto Intestazioni di richiesta HTTP da registrare insieme alle classificazioni dei dati per la redazione. Se vuoto, non vengono registrate intestazioni di richiesta.
ResponseHeadersDataClasses IDictionary<string, DataClassification> Vuoto Intestazioni di risposta HTTP da registrare con le loro classificazioni dei dati per l'oscuramento. Se è vuoto, non vengono registrate intestazioni di risposta.
RequestQueryParametersDataClasses IDictionary<string, DataClassification> Vuoto Parametri di query della richiesta HTTP da registrare insieme alle loro classificazioni dei dati. Se vuoto, non vengono registrati parametri di query. Funzionalità sperimentale.
LogContentHeaders bool false Abilitare la registrazione delle intestazioni di contenuto HTTP , ad esempio Content-Type. Abilitare solo se le intestazioni del contenuto si trovano in RequestHeadersDataClasses o ResponseHeadersDataClasses. Funzionalità sperimentale.

Registrazione dei parametri di percorso e rotta

Opzione TIPO Predefinito Descrzione
RequestPathLoggingMode OutgoingPathLoggingMode Formatted Come registrare il percorso della richiesta HTTP in uscita. Applicato solo quando RequestPathParameterRedactionMode non è None.
RequestPathParameterRedactionMode HttpRouteParameterRedactionMode Strict Come redigire i parametri del percorso nelle richieste HTTP in uscita.
RouteParameterDataClasses IDictionary<string, DataClassification> Vuoto Instradare i parametri da redigere con le classificazioni dei dati corrispondenti.

Aggiungere gli arricchimenti dei log

Gli arricchimenti dei log client HTTP consentono di aggiungere informazioni contestuali personalizzate ai log client HTTP in base alla richiesta, alla risposta e alle eccezioni. A differenza degli enricher di log per uso generico, gli enricher client HTTP sono specificamente destinati alle richieste HTTP in uscita e hanno accesso a contesti specifici per HTTP.

Ecco un rapido esempio:

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

Per informazioni dettagliate sulla creazione e l'uso di arricchimenti dei log client HTTP, incluse le procedure consigliate e gli scenari avanzati, vedere Arricchimento dei log client HTTP.

Classificazione e redazione dei dati

La registrazione client HTTP si integra con le funzionalità di redaction e classificazione dei dati per proteggere le informazioni riservate. Quando si specifica un DataClassification per le intestazioni, i parametri di query o i parametri di route, il sistema di redaction applica una redaction appropriata in base ai censuratori configurati.

Esempio: Oscuramento di intestazioni sensibili

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

Per ulteriori informazioni sulla configurazione dei redattori, vedere La Redazione dei Dati in .NET.

Redazione del parametro percorso e rotta

Per impostazione predefinita, la registrazione del client HTTP oscura i percorsi delle richieste e delle risposte per proteggere la privacy. Quando si registrano i percorsi delle richieste HTTP, è possibile controllare il modo in cui i parametri di route vengono elaborati usando l'opzione RequestPathParameterRedactionMode :

Modalità Descrzione Example
None Nessuna redazione, viene registrato il percorso completo /api/users/12345/orders/67890
Strict Tutti i parametri di percorso sono oscurati /api/users/{userId}/orders/{orderId}
Loose Vengono oscurati solo i parametri in RouteParameterDataClasses /api/users/12345/orders/{orderId}

L'opzione RequestPathLoggingMode controlla il formato del percorso registrato:

Modalità Descrzione Example
Formatted Usa il formato del modello di route con i nomi dei parametri /api/users/{userId}/orders/{orderId}
Structured Registra separatamente il percorso e i parametri Percorso: /api/users/*/orders/*, Parametri: {userId, orderId}

Esempio: Disabilitare l'oscuramento del percorso

Per registrare percorsi completi e non mascherati (ad esempio, negli ambienti di sviluppo), impostare RequestPathParameterRedactionMode su None:

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

Attenzione

La disabilitazione della redazione del percorso potrebbe esporre informazioni riservate nei registri. Usare HttpRouteParameterRedactionMode.None solo in fase di sviluppo o quando si è certi percorsi non contengono dati sensibili.

Considerazioni sulle prestazioni

La registrazione avanzata dei client HTTP è progettata tenendo presente le prestazioni, ma esistono compromessi da considerare:

  • Registrazione del corpo: l'abilitazione di questa funzione comporta un overhead per il buffering e la lettura dei corpi delle richieste/risposte. Usare BodySizeLimit e BodyReadTimeout per controllare l'utilizzo delle risorse.
  • Registrazione degli header: Registra solo gli header di cui hai bisogno. Vuoti RequestHeadersDataClasses e ResponseHeadersDataClasses evitano il sovraccarico di elaborazione delle intestazioni.
  • Arricchitori: ogni arricchitore registrato viene chiamato per ciascuna richiesta. Mantenere leggera la logica di arricchimento.
  • Redazione: la classificazione e la redazione dei dati aggiungono un sovraccarico minimo, ma scalano con il numero di elementi classificati.

Suggerimento

Negli ambienti di produzione iniziare con la registrazione minima (senza corpo, intestazioni limitate) e abilitare la registrazione aggiuntiva solo per la risoluzione dei problemi.

Vedere anche