Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
Neyi Loglamalı, Neyi Loglamamalı: .NET'te Logging Stratejisi ve İyi Bir Log Event'inin Anatomisi
İyi bir log event'i, okurunun sorusuna cevap veren tek bir olaydır: sabit message template, anlamlı property adları ve EventId taşır. Bookstore sipariş akışındaki beş kötü log satırını üç event'e indiriyor; seviye seçimini, exception'ı iki kez loglamayı ve interpolation'ın CA2254 ile yakalanan maliyetini gerçek çıktılarla gösteriyoruz.
High-Performance Logging: LoggerMessage Source Generator, IsEnabled ve Allocation Maliyeti
Kapalı seviyedeki bir LogDebug satırı bile params object[] ve boxing yüzünden çağrı başına 128 byte ayırır; [LoggerMessage] source generator'ı tipli parametre ve IsEnabled kontrolüyle bunu sıfıra indirir. BenchmarkDotNet ölçümleri, event kataloğu, primary constructor, [LogProperties] ve Telemetry paketinin generator'ı değiştirmesinin bedeli.
Serilog Derinlemesine: Bootstrap Logger, appsettings Yapılandırması, Enricher'lar ve Request Logging
Production'a uygun Serilog kurulumu iki aşamalıdır: açılış hatalarını yakalayan bir bootstrap logger, ardından appsettings ve DI'dan beslenen asıl logger. ReadFrom.Configuration, kendi enricher'ımız, PushProperty ile BeginScope farkı, istek başına tek özet event yazan UseSerilogRequestLogging ve CloseAndFlush unutulunca kaybolan log'lar.
Serilog Sink'leri: Console, File, Seq ve OpenTelemetry — Async, Batching ve Kayıp Log
Container'da log stdout'a compact JSON olarak yazılır; dosya gerekiyorsa rolling ve retention açıkça ayarlanır. Serilog 4'ün core batching'i ve async wrapper, yavaş bir sink karşısında ya event atar ya uygulamayı bekletir: 2.000 event'ten 101'i ulaştı ya da döngü 2,4 saniye sürdü. SelfLog, OTLP'ye çıkış ve sink bazında seviye ayırmak.
Seq ile Structured Log'ları Okumak: Docker Kurulumu, Sorgular, Signal'lar ve Alert'ler
Seq'i Docker'da parola ve ayrı ingestion portuyla kuruyor, yalnız Ingest yetkili API key ile Serilog ve OTLP üzerinden log gönderiyoruz. Filtreler, group by ve percentile sorguları, aynı TraceId'deki log ve span'ler, signal, alert ve signal'a bağlı retention gerçek sonuçlarla; 8 hatanın neden 16 event olduğu ve OTLP'deki ERROR seviyesi tuzağı dahil.
Correlation ID ve Trace Context: Bir İsteğin Bütün Loglarını API'den Queue'ya Kadar Bağlamak
Bir isteğin bütün log'larını bağlamanın yolu, her log satırına W3C traceparent'tan gelen TraceId'yi yazmaktır. ASP.NET Core ve HttpClient bunu kendiliğinden yapar; queue ve BackgroundService'te zincir kopar ve DistributedContextPropagator ile elle taşınmalıdır. ActivityTrackingOptions, Serilog, baggage, X-Correlation-ID, hata ekranında destek kodu ve Seq'te tek sorgu gerçek çıktılarla.
Log'larda Hassas Veri: Redaction, Data Classification ve KVKK'ya Uygun Logging
Hassas veriyi log'dan uzak tutmanın yolu onu sınıflandırıp logging pipeline'ında otomatik maskelemektir. Microsoft.Extensions.Compliance.Redaction ile taxonomy ve attribute'lar, [LogProperties], ErasingRedactor, kendi redactor'ın ve korelasyonu koruyan HMAC redactor'ı; Serilog'da destructuring ile maskeleme, exception message'ındaki kişisel veri ve bunu yakalayan bir FakeLogger testi gerçek çıktılarla.
ASP.NET Core'da HTTP Logging: AddHttpLogging, W3C Logger ve Request/Response Body'nin Maliyeti
HTTP logging'i production'da istek başına tek event, kapalı body ve yalnız hata anında body loglayan bir interceptor ile kullan. AddHttpLogging'in gerçek varsayılanları, header allow list'i, CombineLogs, [HttpLogging] ve WithHttpLogging, 4xx/5xx'te body loglayan IHttpLoggingInterceptor, W3C logger dosyası ve body loglamanın ölçülmüş maliyeti: istek başına 8 KB yerine 85 KB allocation.
Log Level'ları ve Maliyet: Sampling, Buffering ve Production'da Log Seviyesini Canlı Değiştirmek
Log hacmini seviye ayarı belirler: aynı 1000 istek Debug'da 6,3 MB, Information ve Microsoft.AspNetCore=Warning ile 246 KB log üretti. Microsoft.Extensions.Telemetry ile random ve trace-based sampling'i, hata olunca Debug log'larını yazan per-request buffering'i, restart'sız seviye değişikliğini ve sampling'in Error'ları, buffer'ın scope ile TraceId'yi nasıl kaybettiğini gerçek çıktılarla gösteriyoruz.
.NET 8'den .NET 11'e Logging'de Gelenler: Enrichment, Redaction, FakeLogger, Buffering ve Generic LoggerMessage
.NET'te logging iki trenle ilerliyor: ILogger ve source generator runtime ile, enrichment, redaction, FakeLogger, sampling ve buffering ise aylık sürüm alan Microsoft.Extensions.Telemetry paketleriyle geliyor. Hangi özelliğin hangi sürümde geldiğini, .NET 10'daki CA1873 ve obsolete olan AddServiceLogEnricher'ı, .NET 11'deki generic LoggerMessage'ı ve eski Serilog Startup kodunun nasıl okunacağını gerçek çıktılarla gösteriyoruz.