Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Wenn Sie Anwendungen erstellen, die HTTP-Anforderungen stellen, hilft Ihnen die strukturierte Protokollierung bei der Überwachung, Problembehandlung und Analyse ausgehenden Datenverkehrs. Die AddExtendedHttpClientLogging Erweiterung bietet eine erweiterte Protokollierung für alle HTTP-Clients, die mit IHttpClientFactory erstellt wurden, mit integrierter Unterstützung für:
- Konfigurierbare Protokollierung – Steuern, was protokolliert wird (Header, Textkörper, Abfrageparameter, Routenparameter)
- Datenredaktion – Anwenden von Datenklassifizierungs- und Datenmaskierungsrichtlinien für Datenschutz und Compliance
- Protokollanreicherung – Hinzufügen eines benutzerdefinierten Kontexts zu HTTP-Anforderungsprotokollen
- Minimaler Aufwand – Opt-In-Features mit leistungsbewussten Standardwerten
Aktivieren Sie die erweiterte HTTP-Clientprotokollierung, indem Sie die AddExtendedHttpClientLogging Erweiterungsmethode aufrufen. Dadurch wird der standardmäßige HTTP-Client-Logger durch einen erweiterten Logger ersetzt, der differenzierte Konfigurations- und Datenkonformitätsfunktionen unterstützt.
Hinzufügen des Pakets
dotnet add package Microsoft.Extensions.Http.Diagnostics
Oder, wenn Sie .NET 10+ SDK verwenden:
dotnet package add Microsoft.Extensions.Http.Diagnostics
Weitere Informationen finden Sie unter dotnet package add or Manage package dependencies in .NET applications.
HTTP-Clientprotokollierung aktivieren
Rufen Sie zum Hinzufügen der erweiterten HTTP-Clientprotokollierung zu Ihrer Anwendung die AddExtendedHttpClientLogging Erweiterungsmethode beim Konfigurieren Ihrer Dienste auf:
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();
Diese Registrierung fügt allen HTTP-Clients, die durch IHttpClientFactory erstellt wurden, einen erweiterten Logger hinzu, wobei der Standardlogger durch einen ersetzt wird, der eine erweiterte Konfiguration unterstützt.
Von Bedeutung
AddExtendedHttpClientLogging() entfernt alle anderen Logger, einschließlich den Standardlogger, der über AddDefaultLogger() registriert wurde. Dadurch wird ein einheitliches Protokollierungsverhalten für alle HTTP-Clients sichergestellt.
Von Bedeutung
Sie müssen die Redaktionsdienste registrieren, indem Sie das AddRedaction-Paket von Microsoft.Extensions.Compliance.Redaction aufrufen. Das Protokollierungsfeature des HTTP-Clients entfernt standardmäßig vertrauliche Informationen (z. B. Routenparameter) und erfordert einen Anbieter für die Redaktionsfunktion im Dependency-Injection-Container.
Anwenden der Protokollierung auf bestimmte HTTP-Clients
Sie können die erweiterte Protokollierung auch auf bestimmte benannte oder typierte HTTP-Clients anwenden, indem Sie die IHttpClientBuilder Erweiterungsmethoden verwenden:
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();
Bei Verwendung der IHttpClientBuilder Überladungen wird die Protokollierung nur auf diesen bestimmten Client angewendet, nicht global.
Anzeigen erweiterter Protokolldaten
Die verbesserte HTTP-Clientprotokollierung fügt unter Verwendung von Anreicherungen Informationen zu den Protokollen hinzu, was bedeutet, dass Daten als Tags zu strukturierten Protokollen und nicht zur Konsolennachricht hinzugefügt werden. Verwenden Sie einen Protokollierungsanbieter, der strukturierte Protokolle unterstützt, um die erweiterten Informationen anzuzeigen.
Verwenden Sie AddJsonConsole, um für schnelle Tests strukturierte Protokolle in der Konsole auszugeben.
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");
});
Für Produktionsszenarien sollten Sie die Verwendung von strukturierten Protokollierungsanbietern wie Application Insights, Seq oder Elasticsearch in Betracht ziehen, die die erweiterten Tagdaten abfragen und visualisieren können.
Konfigurieren von Protokollierungsoptionen
Sie konfigurieren die HTTP-Clientprotokollierung über die LoggingOptions Klasse mithilfe des Standardoptionenmusters. Sie können Optionen im Code konfigurieren oder aus der Konfiguration binden (z. B appsettings.json. ).
Konfigurieren mit einer Stellvertretung
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");
});
Konfigurieren von 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"));
Konfigurationsoptionen
Die LoggingOptions Klasse bietet die folgenden Konfigurationsoptionen:
Grundlegende Protokollierungsoptionen
| Option | Typ | Standard | Description |
|---|---|---|---|
LogRequestStart |
bool |
false |
Wenn true, protokolliert die Anforderung vor beginn der Verarbeitung. Wenn false, protokolliert einen einzelnen Eintrag mit Anforderungs- und Antwortdaten. |
LogBody |
bool |
false |
Ermöglicht die Protokollierung von HTTP-Anforderungs- und Antworttexten. Warnung: Vermeiden Sie die Aktivierung in der Produktion, da vertrauliche Informationen verloren gehen können. |
BodySizeLimit |
int |
32.768 (≈32 KB) | Maximale Anzahl von Bytes, die aus Anforderungs- oder Antworttext gelesen werden sollen. Halten Sie unterhalb von 85.000 Byte, um die Zuweisung im Large Object Heap zu vermeiden. |
BodyReadTimeout |
TimeSpan |
1 Sekunde | Maximale Wartezeit beim Lesen der Anforderung oder des Antworttexts. Muss zwischen 1 Millisekunden und 1 Minute betragen. |
RequestBodyContentTypes |
ISet<string> |
Leer | HTTP-Anforderungsinhaltstypen gelten als Text und sind für die Serialisierung berechtigt. |
ResponseBodyContentTypes |
ISet<string> |
Leer | HTTP-Antwortinhaltstypen gelten als Text und sind für die Serialisierung berechtigt. |
Header- und Abfrageparameterprotokollierung
| Option | Typ | Standard | Description |
|---|---|---|---|
RequestHeadersDataClasses |
IDictionary<string, DataClassification> |
Leer | HTTP-Anforderungsheader zum Protokollieren mit ihren Datenklassifizierungen zur Redaction. Wenn leer, werden keine Anforderungsheader protokolliert. |
ResponseHeadersDataClasses |
IDictionary<string, DataClassification> |
Leer | Zur Schwärzung sind HTTP-Antwortheader mit ihren Datenklassifizierungen zu protokollieren. Wenn leer, werden keine Antwortheader protokolliert. |
RequestQueryParametersDataClasses |
IDictionary<string, DataClassification> |
Leer | HTTP-Abfrageparameter zum Protokollieren einschließlich ihrer Datenklassifizierungen. Wenn leer, werden keine Abfrageparameter protokolliert. Experimentelles Feature. |
LogContentHeaders |
bool |
false |
Aktivieren Sie die Protokollierung von HTTP-Inhaltsheadern (z. B. Content-Type). Nur aktivieren, wenn Kopfzeileninhalte in RequestHeadersDataClasses oder ResponseHeadersDataClasses sind. Experimentelles Feature. |
Pfad- und Routenparameterprotokollierung
| Option | Typ | Standard | Description |
|---|---|---|---|
RequestPathLoggingMode |
OutgoingPathLoggingMode |
Formatted |
So protokollieren Sie den ausgehenden HTTP-Anforderungspfad. Wird nur angewendet, wenn RequestPathParameterRedactionMode nicht None. |
RequestPathParameterRedactionMode |
HttpRouteParameterRedactionMode |
Strict |
Wie man Pfadparameter in ausgehenden HTTP-Anforderungen maskiert. |
RouteParameterDataClasses |
IDictionary<string, DataClassification> |
Leer | Parameter mit ihren entsprechenden Datenklassifizierungen zur Anonymisierung weiterleiten. |
Hinzufügen von Protokollanreicherungsfunktionen
Mithilfe von HTTP-Client-Loganreicherern können Sie HTTP-Client-Logs mit benutzerdefinierten Kontextinformationen basierend auf der Anforderung, der Antwort und einer Ausnahme anreichern. Im Gegensatz zu allgemeinen Log-Erweiterern zielen HTTP-Client-Erweiterer speziell auf ausgehende HTTP-Anforderungen ab und haben Zugriff auf HTTP-spezifischem Kontext.
Hier ist ein schnelles Beispiel:
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>();
Ausführliche Informationen zum Erstellen und Verwenden von HTTP-Clientprotokollreicherern, einschließlich bewährter Methoden und erweiterter Szenarien, finden Sie unter HTTP-Clientprotokollreicherer.
Datenklassifizierung und -redaction
Die HTTP-Clientprotokollierung ist in die Datenreduzierung und die Datenklassifizierung integriert, um vertrauliche Informationen zu schützen. Wenn Sie DataClassification für Kopfzeilen, Abfrageparameter oder Routenparameter angeben, wird das Bearbeitungssystem basierend auf den konfigurierten Redakteuren entsprechende Bearbeitungsaktionen anwenden.
Beispiel: Bearbeiten vertraulicher Kopfzeilen
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);
});
Weitere Informationen zum Konfigurieren von Redactors finden Sie unter Data redaction in .NET.
Redaction des Pfad- und Routenparameters
Standardmäßig werden Anforderungs- und Antwortpfade bei der HTTP-Client-Protokollierung unkenntlich gemacht, um den Datenschutz zu schützen. Beim Protokollieren von HTTP-Anforderungspfaden können Sie steuern, wie Routenparameter mithilfe der RequestPathParameterRedactionMode Option redigiert werden:
| Modus | Description | Example |
|---|---|---|
None |
Keine Redaction, der vollständige Pfad wird protokolliert. | /api/users/12345/orders/67890 |
Strict |
Alle Pfadparameter werden entfernt | /api/users/{userId}/orders/{orderId} |
Loose |
Nur die Parameter in RouteParameterDataClasses werden geschwärzt. |
/api/users/12345/orders/{orderId} |
Die RequestPathLoggingMode Option steuert das Format des protokollierten Pfads:
| Modus | Description | Example |
|---|---|---|
Formatted |
Verwendet das Routenvorlagenformat mit Parameternamen. | /api/users/{userId}/orders/{orderId} |
Structured |
Protokolliert Pfad und Parameter separat | Pfad: /api/users/*/orders/*, Params: {userId, orderId} |
Beispiel: Deaktivieren der Pfadanonymisierung
Um vollständige, unveränderte Pfade (z. B. in Entwicklungsumgebungen) zu protokollieren, setzen Sie RequestPathParameterRedactionMode auf None.
builder.Services.AddExtendedHttpClientLogging(options =>
{
// Disable redaction of request/response paths
options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});
Vorsicht
Das Deaktivieren der Pfadredaktion macht möglicherweise vertrauliche Informationen in Protokollen verfügbar. Verwenden Sie HttpRouteParameterRedactionMode.None nur in der Entwicklung oder wenn Sie sicher sind, dass die Pfade keine vertraulichen Daten enthalten.
Leistungsüberlegungen
Die erweiterte HTTP-Clientprotokollierung ist unter Berücksichtigung der Leistung konzipiert, es gibt jedoch Kompromisse:
-
Body-Logging: Das Aktivieren von
LogBodyfügt Overhead beim Puffern und Lesen der Anfrage-/Antwortkörper hinzu. Verwenden SieBodySizeLimitundBodyReadTimeout, um die Ressourcennutzung zu steuern. -
Headerprotokollierung: Loggen Sie nur die Header, die Sie benötigen. Leere
RequestHeadersDataClassesundResponseHeadersDataClassesvermeiden den Verarbeitungsaufwand der Kopfzeilen. - Anreicher: Jeder registrierte Anreicherer wird für jede Anforderung aufgerufen. Halten Sie die Anreicherungslogik leichtgewichtig.
- Redaction: Datenklassifizierung und Redaction fügen minimalen Aufwand hinzu, skalieren jedoch mit der Anzahl der klassifizierten Elemente.
Tipp
Beginnen Sie in Produktionsumgebungen mit minimaler Protokollierung (kein Textkörper, eingeschränkte Header), und aktivieren Sie zusätzliche Protokollierung nur für die Problembehandlung.