Serilog ile Yapilandirilmis Loglama
Serilog kurulumu, enricher ve sink yapilandirmasi ile anlamli, sorgulanabilir loglar.
Bir makale sayfası zaman zaman yavaş açıldığında, hangi kaydın etkilendiğini ve gecikmenin hangi isteğe ait olduğunu birkaç dakika içinde bulabilmek önemlidir. Serilog, log olayına mesajla birlikte ArticleId, ElapsedMs ve TraceId gibi alanlar eklemeyi sağlar. Bu alanları bir log toplayıcıya gönderdiğinizde, örneğin tek bir makalenin son saatteki yavaş isteklerini doğrudan filtreleyebilirsiniz.
Mesaj şablonuna sorgulanabilir alanlar ekleyin
ILogger<T> üzerinden sabit bir mesaj şablonu verip alanların değerlerini ayrı argümanlar olarak geçirin. {ArticleId} alanı, olayın içinde kendi değerini taşır. Alan adlarını ekip genelinde tutarlı tutun. Örneğin her yerde ElapsedMs kullanıldığında süreye göre filtreleme ve eşik tanımı basitleşir.
logger.LogInformation(
"Makale {ArticleId} {ElapsedMs} ms içinde yüklendi",
articleId, stopwatch.Elapsed.TotalMilliseconds);
ASP.NET Core’a bağlayın ve JSON üretin
Hedef .NET sürümüyle uyumlu Serilog.AspNetCore paketiyle sağlayıcıyı kaydedin. Aşağıdaki örnek, Serilog.Sinks.Console ve Serilog.Formatting.Compact bileşenleriyle olayları konsola JSON olarak yazar. UseSerilogRequestLogging, kendisinden sonra işlenen HTTP istekleri için yöntem, yol, durum kodu ve süreyi içeren bir tamamlanma olayı üretir. Örnekte ayrıca ASP.NET Core’un varsayılan istek loglarının yoğunluğunu azaltmak için kategori seviyeleri ayarlanır.
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Compact;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddSerilog((_, log) => log
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Enrich.WithProperty("Application", "MyCMS")
.WriteTo.Console(new RenderedCompactJsonFormatter()));
var app = builder.Build();
app.UseSerilogRequestLogging();
app.MapControllers();
app.Run();
Tek isteğe ait olayları ilişkilendirin
Bir hata araştırırken önce 5xx yanıtı veren isteği bulun, ardından aynı iz kimliğine sahip uygulama olaylarını inceleyin. Dağıtık izleme kullanıyorsanız Activity.Current?.TraceId değerini log kapsamına ekleyerek API ve diğer servislerde aynı isteğe ait olayları ilişkilendirebilirsiniz. Yalnızca HTTP tamamlanma olayına eklenecek ArticleId gibi bir alan için Serilog’un IDiagnosticContext arayüzünü kullanabilirsiniz.
Filtrelemede ihtiyacınız olan alanları açıkça seçin. İstek gövdelerini topluca loglamak yerine işlem adı, teknik kayıt kimliği ve süre gibi sınırlı alanları kaydedin. Erişim belirteçleri, parolalar ve bağlantı dizeleri loglara girmemeli. Bir alanı eklemeden önce kimin okuyacağını ve ne kadar süre saklanacağını belirleyin.
Yük altında log akışını da ölçün
Konsola veya dosyaya yazmanın gecikmeye etkisini test edin. Serilog.Sinks.Async gibi tamponlu bir sarmalayıcı bazı hedeflerde yazma işini arka plana taşır. Varsayılan davranışta tampon dolduğunda yeni olaylar düşebilir. Bu yüzden tamponun doluluk ve kayıp sayaçlarını izleyin, kapanışta bekleyen olayların yazılmasını sağlayın. Log kaybının kabul edilmediği bir akış için teslimat gereksinimini ayrıca tasarlayın.
Kurulumu doğrulamak için aynı makaleye iki istek gönderin. JSON çıktısında HTTP tamamlanma olaylarını görün ve uygulama olayını ArticleId alanına göre filtreleyin. Sonra kontrollü bir hata oluşturup aynı isteğin durum kodunu ve hata olayını birlikte bulabildiğinizi kontrol edin.