.NET'te HTTP istemci loglaması

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üğü: LogBody etkinleştirildiğinde, istek/yanıt gövdelerini arabelleğe almak ve okumak için ek yük getirir. Kaynak kullanımını denetlemek için BodySizeLimit ve BodyReadTimeout kullanın.
  • Üst bilgi kaydı: Yalnızca ihtiyacınız olan üst bilgileri kaydedin. Boş RequestHeadersDataClasses ve ResponseHeadersDataClasses, 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.

Ayrıca bakınız