Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
HTTP isteklerinde bulunan uygulamalar oluşturduğunuzda yapılandırılmış günlük, giden trafiği izlemenize, sorun gidermenize ve analiz etmenize yardımcı olur. Uzantı, AddExtendedHttpClientLogging ile IHttpClientFactoryoluşturulan tüm HTTP istemcileri için gelişmiş günlük kaydı sağlar ve aşağıdakiler için yerleşik destek sağlar:
- Yapılandırılabilir günlük - Kaydedilecek öğeleri kontrol etme (üst bilgiler, gövde, sorgu parametreleri, yol parametreleri)
- Veri yeniden düzenleme - Gizlilik ve uyumluluk için veri sınıflandırma ve yeniden düzenleme ilkeleri uygulama
- Günlük zenginleştirme - HTTP istek günlüklerine özel bağlam ekleme
- Minimum ek yük - Performans odaklı varsayılanlara sahip isteğe bağlı özellikler
Uzantı yöntemini çağırarak AddExtendedHttpClientLogging gelişmiş HTTP istemci günlüğünü etkinleştirin. Bu, varsayılan HTTP istemci günlükçüsunun yerini ayrıntılı yapılandırma ve veri uyumluluk özelliklerini destekleyen genişletilmiş bir günlükçü ile değiştirir.
Paketi ekle
dotnet add package Microsoft.Extensions.Http.Diagnostics
Veya .NET 10+ SDK kullanıyorsanız:
dotnet package add Microsoft.Extensions.Http.Diagnostics
Daha fazla bilgi için bkz. dotnet paket ekleme veya .NET uygulamalarında paket bağımlılıklarını yönetme.
HTTP istemci günlüğünü etkinleştirme
Uygulamanıza gelişmiş HTTP istemci günlüğü eklemek için hizmetlerinizi yapılandırırken uzantı yöntemini çağırın AddExtendedHttpClientLogging :
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();
Bu kayıt, IHttpClientFactory üzerinden oluşturulan tüm HTTP istemcilerine gelişmiş bir günlükçü ekler ve varsayılan günlükçü yerine gelişmiş yapılandırmayı destekleyen bir hale getirir.
Önemli
AddExtendedHttpClientLogging(), AddDefaultLogger() aracılığıyla kaydedilen varsayılan günlükçü de dahil olmak üzere, diğer tüm günlükçüleri kaldırır. Bu, tüm HTTP istemcilerinde tutarlı günlük davranışı sağlar.
Önemli
Redaction hizmetlerini AddRedaction paketinden Microsoft.Extensions.Compliance.Redaction arayarak kaydetmeniz gerekir. HTTP istemci günlüğü özelliği, hassas bilgileri varsayılan olarak gizler (yol parametreleri gibi) ve bağımlılık enjeksiyonu kapsayıcısında bir düzenleyici sağlayıcı gerektirir.
Günlüğü belirli HTTP istemcilerine uygulama
Uzantı yöntemlerini kullanarak IHttpClientBuilder belirli adlandırılmış veya yazılan HTTP istemcilerine gelişmiş günlük kaydı da uygulayabilirsiniz:
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();
Aşırı yüklemeler kullanılırken IHttpClientBuilder günlük yalnızca ilgili istemciye uygulanır, küresel ölçekte uygulanmaz.
Zenginleştirilmiş günlük verilerini görüntüleme
Gelişmiş HTTP istemci günlüğü zenginleştirme kullanarak günlüklere bilgi ekler; bu da verilerin konsol iletisi yerine yapılandırılmış günlüklere etiket olarak eklendiği anlamına gelir. Zenginleştirilmiş bilgileri görüntülemek için yapılandırılmış günlükleri destekleyen bir günlük sağlayıcısı kullanın.
Hızlı test için yapılandırılmış günlükleri konsola yazdırmak için kullanın AddJsonConsole :
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");
});
Üretim senaryoları için, zenginleştirilmiş etiket verilerini sorgulayıp görselleştirebilen Application Insights, Seq veya Elasticsearch gibi yapılandırılmış günlük sağlayıcıları kullanmayı göz önünde bulundurun.
Günlük kaydı seçeneklerini yapılandırma
Standart seçenekler deseni kullanarak LoggingOptions üzerinden HTTP istemci günlüğünü yapılandırırsınız. Koddaki seçenekleri yapılandırabilir veya yapılandırmadan bağlayabilirsiniz (örneğin, appsettings.json).
Bir temsilci ile yapılandırma
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");
});
appsettings.json'dan yapılandırma
{
"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"));
Yapılandırma seçenekleri
LoggingOptions sınıfı aşağıdaki yapılandırma seçeneklerini sağlar:
Temel günlük seçenekleri
| Seçenek | Türü | Varsayılan | Description |
|---|---|---|---|
LogRequestStart |
bool |
false |
true olduğunda, işleme başlamadan önce isteği günlüğe kaydeder.
false olduğunda, istek ve yanıt verilerini içeren tek bir girişi günlüğe kaydeder. |
LogBody |
bool |
false |
HTTP istek ve yanıt gövdelerinin kaydedilmesini etkinleştirir. Uyarı: Hassas bilgileri sızdırabileceğinden üretimde etkinleştirmekten kaçının. |
BodySizeLimit |
int |
32.768 (≈32 KB) | İstek veya yanıt gövdesinden okunacak bayt sayısı üst sınırı. Büyük nesne yığın ayırmasını önlemek için 85.000 bayt'ın altında tutun. |
BodyReadTimeout |
TimeSpan |
1 saniye | İstek veya yanıt gövdesi okunurken azami bekleme süresi. 1 milisaniye ile 1 dakika arasında olmalıdır. |
RequestBodyContentTypes |
ISet<string> |
Boş | HTTP isteği içerik türleri metin olarak kabul edilir ve serileştirme için uygundur. |
ResponseBodyContentTypes |
ISet<string> |
Boş | HTTP yanıtı içerik türleri metin olarak kabul edilir ve serileştirme için uygundur. |
Başlık ve sorgu parametresi günlüğü
| Seçenek | Türü | Varsayılan | Description |
|---|---|---|---|
RequestHeadersDataClasses |
IDictionary<string, DataClassification> |
Boş | Günlüğe kaydedilecek ve veri sınıflandırmalarına göre yeniden düzenlenecek HTTP istek başlıkları. Boşsa, hiçbir istek üst bilgisi günlüğe kaydedilmez. |
ResponseHeadersDataClasses |
IDictionary<string, DataClassification> |
Boş | Yeniden işlem için veri sınıflandırmalarıyla günlüğe kaydedilecek HTTP yanıt üst bilgileri. Boşsa, hiçbir yanıt başlığı günlüğe kaydedilmez. |
RequestQueryParametersDataClasses |
IDictionary<string, DataClassification> |
Boş | Veri sınıflandırmalarıyla birlikte günlüğe kaydedilecek HTTP istek sorgu parametreleri. Boşsa, hiçbir sorgu parametresi günlüğe kaydedilmez. Deneysel özellik. |
LogContentHeaders |
bool |
false |
HTTP içerik başlıklarının günlüğe kaydedilmesini etkinleştirin (örneğin, Content-Type). İçerik üst bilgileri RequestHeadersDataClasses veya ResponseHeadersDataClasses içinde ise etkinleştirin. Deneysel özellik. |
Yol ve rota parametresi günlüğü
| Seçenek | Türü | Varsayılan | Description |
|---|---|---|---|
RequestPathLoggingMode |
OutgoingPathLoggingMode |
Formatted |
Çıkan HTTP isteği yolunu nasıl günlüğe kaydedersiniz. Yalnızca RequestPathParameterRedactionModeNone olmadığında uygulanır. |
RequestPathParameterRedactionMode |
HttpRouteParameterRedactionMode |
Strict |
Giden HTTP isteklerinde yol parametrelerini düzenleme. |
RouteParameterDataClasses |
IDictionary<string, DataClassification> |
Boş | Parametreleri ilgili veri sınıflandırmalarıyla yeniden işlem yapmak için yönlendirin. |
Kayıt zenginleştiricileri ekle
HTTP istemci günlüğü zenginleştiricileri istek, yanıt ve özel durumlara göre HTTP istemci günlüklerine özel bağlamsal bilgiler eklemenize olanak tanır. Genel amaçlı günlük zenginleştiricilerinden farklı olarak, HTTP istemci zenginleştiricileri giden HTTP isteklerini özellikle hedefler ve HTTP'ye özgü bağlama erişime sahiptir.
İşte hızlı bir örnek:
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>();
En iyi yöntemler ve gelişmiş senaryolar da dahil olmak üzere HTTP istemci günlüğü zenginleştiricileri oluşturma ve kullanma hakkında ayrıntılı bilgi için bkz. HTTP istemci günlüğü zenginleştiricisi.
Veri sınıflandırma ve redaksiyon
HTTP istemci günlüğü, hassas bilgileri korumak için veri gizleme ve veri sınıflandırma özellikleriyle entegre olur. Üst bilgiler, sorgu parametreleri veya yol parametreleri için bir DataClassification belirttiğinizde, düzenleme sistemi yapılandırılmış düzenleyicilerinize göre uygun düzenlemeyi uygular.
Örnek: Hassas üst bilgileri sansürleme
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);
});
Redaktörleri yapılandırma hakkında daha fazla bilgi için bkz. .NET'te veri yeniden oluşturma.
Yol ve yol parametresi sansürleme
Varsayılan olarak HTTP istemci günlüğü, gizliliği korumak için istek ve yanıt yollarını yeniden kaydeder. HTTP isteği yollarını günlüğe kaydettiğinizde, yol parametrelerinin nasıl gizlendiğini şu seçeneği kullanarak RequestPathParameterRedactionMode denetleyebilirsiniz:
| Çalışma Modu | Description | Example |
|---|---|---|
None |
Veriler düzenlenmedi, tam dosya yolu günlüğe kaydedildi | /api/users/12345/orders/67890 |
Strict |
Tüm yol parametreleri gizlenmiştir | /api/users/{userId}/orders/{orderId} |
Loose |
Yalnızca RouteParameterDataClasses içindeki parametreler gizlenir |
/api/users/12345/orders/{orderId} |
seçeneği, RequestPathLoggingMode günlüğe kaydedilen yolun biçimini denetler:
| Çalışma Modu | Description | Example |
|---|---|---|
Formatted |
Parametre adlarıyla yol şablonu biçimini kullanır | /api/users/{userId}/orders/{orderId} |
Structured |
Yolun ve parametrelerin günlüğünü ayrı ayrı kaydeder | Yol: /api/users/*/orders/*, Parametreler: {userId, orderId} |
Örnek: Yol gizlemeyi devre dışı bırakma
Eksiksiz, sansürsüz yolları (örneğin, geliştirme ortamlarında) günlüğe kaydetmek için RequestPathParameterRedactionMode öğesini None olarak ayarlayın.
builder.Services.AddExtendedHttpClientLogging(options =>
{
// Disable redaction of request/response paths
options.RequestPathParameterRedactionMode = HttpRouteParameterRedactionMode.None;
});
Dikkat
Yol gizleme devre dışı bırakıldığında, günlüklerde hassas bilgiler ortaya çıkabilir. Yalnızca HttpRouteParameterRedactionMode.None geliştirme aşamasında veya yolların hassas veriler içermediğinden kesin emin olduğunuzda kullanın.
Performansla ilgili dikkat edilmesi gerekenler
Gelişmiş HTTP istemci günlüğü, performans göz önünde bulundurularak tasarlanmıştır, ancak dikkate alınması gereken dengeler vardır:
-
Gövde günlüğü:
LogBodyetkinleştirildiğinde, istek/yanıt gövdelerini arabelleğe almak ve okumak için ek yük getirir. Kaynak kullanımını denetlemek içinBodySizeLimitveBodyReadTimeoutkullanın. -
Üst bilgi kaydı: Yalnızca ihtiyacınız olan üst bilgileri kaydedin. Boş
RequestHeadersDataClassesveResponseHeadersDataClasses, başlık işlemenin ek yükünü önler. - Zenginleştiriciler: Her kayıtlı zenginleştirici her istek için çağrılır. Zenginleştirici mantığı hafif tutun.
- Redaction: Veri sınıflandırması ve redaksiyon çok az ek yük getirir, ancak sınıflandırılmış öğe sayısıyla ölçeklendirilir.
Tavsiye
Üretim ortamlarında en az loglama ile (gövde dahil edilmeden, sınırlı başlıklar) başlayın ve yalnızca sorun giderme için ek loglamayı etkinleştirin.