Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 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
BodySizeLimiteBodyReadTimeoutper controllare l'utilizzo delle risorse. -
Registrazione degli header: Registra solo gli header di cui hai bisogno. Vuoti
RequestHeadersDataClasseseResponseHeadersDataClassesevitano 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.