Bu yazımda logging işlemlerinin nasıl yapılabileceğini, neden yapılması gerektiğini ve best practice’leri göstereceğim.
Logging nedir ?
Logging, bir uygulamanın çalışması sırasında meydana gelen olayların kaydedilmesi sürecidir. Bu olaylar, hata ve uyarı mesajlarından bilgilendirme ve izleme mesajlarına kadar geniş bir yelpazeyi kapsar. Logging, geliştiricilerin ve sistem yöneticilerinin uygulamanın davranışını anlamalarını, hataları tespit etmelerini ve performans analizi yapmalarını sağlar. Doğru yapılandırılmış bir logging sistemi, yazılım geliştirme ve bakım sürecini büyük ölçüde kolaylaştırır. Uygulama içerisindeki kritik olayların kaydedilmesi, uygulama hatalarının hızlı bir şekilde teşhis edilmesine ve giderilmesine olanak tanır. Bu nedenle, logging, yazılım geliştirme süreçlerinde önemli bir rol oynar ve uygulamaların güvenilirliğini ve sürdürülebilirliğini artırır.
Logging’e ihtiyacımız olan yer özellikle production (canlı) ortamıdır, geliştirme(development) sürecinde kodumuz üzerinde hata ayıklama (debug) işlemleri yaparak ilgili break pointler( kod duraklatma noktaları) üzerinde kodun hangi aşamaya kadar geldiğini ne kadar süre içerisinde geldiğini gibi bilgileri görebiliyoruz hatta o aşamada kodumuzun içerisinde neler yazıyor örneğin oluşturduğumuz bir int değişkeninin içeriğini görebiliyor ve hatta müdahele edebiliyoruz. Müdahele kısmı production ortamı için biraz fazla evet ancak diğer aşamaların tamamını görüntüleyebilmemiz logging ile mümkün.
Özetle programın çalışırken aşamaları hakkında bilgi alabilmek istiyorsak logging kullanmalıyız.
Peki nasıl kullanabiliriz?
C# WebApi üzerinde logging ekleme.
C# WebApi zaten kendi içerisinde hazır bir logging mekanizmasına sahip gelin bir dotnet uygulaması açıp bunun içerisindeki ayarlara bakalım.
1 |
dotnet new webapi -n LoggingExample |
Öncelikle oluşturulan projenin appsettings.jsonuzantılı dosyasına bir göz atalım istiyorum.
1 2 3 4 5 6 7 8 9 10 |
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*" } |
Gördüğünüz gibi burada logging olarak bazı ayarlar verebilmemiz mümkün.
C# webapi (.net 8) ile oluşturulan kodun en altına (program.cs içerisinde) aşağıdaki oluşturduğum ornekServis sınıfını yapıştıralım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class OrnekServis { private readonly ILogger<OrnekServis> _logger; public OrnekServis(ILogger<OrnekServis> logger) { _logger = logger; } public void AddLog() { _logger.LogInformation("Test bir log"); } } |
Buradaki ornekServis class’ının pek bi işlevi yok sadece log mekanizmasını çalıştırmak için kullanılıyor.
Minimal Api içerisinde app.MapGet(“/weatherforecast) adlı map methodunu da aşağıdaki şekilde güncelleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
app.MapGet("/weatherforecast", ([FromServices] OrnekServis ornekServis) => { ornekServis.AddLog(); var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateOnly.FromDateTime(DateTime.Now.AddDays(index)), Random.Shared.Next(-20, 55), summaries[Random.Shared.Next(summaries.Length)] )) .ToArray(); return forecast; }) .WithName("GetWeatherForecast") .WithOpenApi(); |
Gördüğünüz gibi [FromServices] attribute’ü ile ornekServis’imizi projemize implemente ettik.
NOT: ornek servisi ioc içerisine de aşağıdaki kod ile builder.Build methodundan önce eklememiz gerekmektedir.
1 |
builder.Services.AddScoped<OrnekServis>(); |
şimdi projemizi dotnet run ile çalıştıralım.
görsele baktığınızda information olarak bazı logları verdiğini görmekteyiz şimdi bizim servis içerisinde eklediğimiz AddLog methodundaki logu görebilmemiz için http://localhost:5114/swagger/index.html adlı adrese gitmemiz gerekmektedir.
Not: Buradaki localhost:5114 adresi sizde farklı olabilir lütfen kontrol ediniz.
Swagger üzerinden ilgili endpoint’in yanında bulunan Try it out butonuna tıklayıp execute methodu ile bir kaç defa çalıştıralım.
Daha sonrasında projemizi çalıştırdığımız konsola döndüğümüzde basılan logları görmekteyiz.
Şimdi buraya kadar logların nasıl çalıştığını gördük loglar çalıştırılan konsol(terminal) üzerinde otomatik olarak ekleniyor. Bizim yazmış olduğumuz log’da _logger.LogInformation diyerek Information seviyesinde log eklemiştik.
LogSeviyeleri _logger.Log yazdığımızda zaten çıkıyor.
Buradaki log seviye sıralamaları ile şu şekildedir,
- Trace
- Debug
- Information
- Warning
- Error
- Critical
Şimdi burada minimum loglevel’imizi appsettings.json dosyamız üzerinde belirlemiştik ve information olduğunu görmüştük şimdi gelin bunu Error Seviyesine çekip aynı işlemi tekrarlayalım.
İşlemi tekrarladığınızda ise aşağıdaki gibi bir konsolunuz olacaktır. Yani terrrtemiz. Bunun sebei log level’ı Error seviyesine çekmemiz eğer bir _logger.LogError diyerek loglarsak bu sefer göreceğiz.
Ornekservis içeriğini aşağıdaki gibi değiştirip tekrar istek attığınızda ise değişikliği kendiniz görün isterim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class OrnekServis { private readonly ILogger<OrnekServis> _logger; public OrnekServis(ILogger<OrnekServis> logger) { _logger = logger; } public void AddLog() { _logger.LogError("HATA LOGU"); _logger.LogInformation("BİLGİ LOGU"); } } |
Bu sefer ise sadece Error loglarını gördüğümüzü farkettiniz umarım peki yukarıda duran warning log’u da nedir ?
Evet tahmin edebileceğiniz gibi appsettings.json üzerinde bulunan Logging.LogLevel.Microsoft.AspNetCore başlıkları altında bulacağımız Warning mesajını değiştirirseniz artık o log’u da görmeyeceğiz. Bunun örneğini yapmayacağım çünkü zaten aynı şey.
Göstermek istediğim farklı bir şey var.
Windows bilgisayarlar başlat tuşuna bastığınızda Event Viewer isimli uygulamayı görebilirsiniz.
Buradaki uygulama windows’a düşen logları görebilmemizi sağlıyor
Yukarıdaki iğrenç el yazımla yazdığım rakamlara sırasyıla tıklarsanız aşağıda Event 1000 adlı mesajı görmektesiniz. Biraz daha alt kısımda ise hatanın kaynağı ve hatayla ilgili mesajları görüntüleyebilmekteyiz.
Buraya varsayılan olarak sadece hata logları düşmekte eğer isterseniz buradaki hata loglarının seviyesini daha aşağıya çekebilirsiniz.
EventViewer altına hata logları dışında seviyeyi değiştirip information olarak log koymak isterseniz appsettings’inizi şu şekilde değiştirmeniz gerekmektedir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Logging": { "LogLevel": { "Default": "Error", "Microsoft.AspNetCore": "Warning", }, "EventLog": { "LogLevel": { "Default": "Information" } } }, "AllowedHosts": "*" } |
Burada gördüğünüz gibi Logging altına yeni bir alan olan EventLog alanını ekledik buradaki logLevel parametresini Default olarak Information’a çektiğimizde EventViewer’a Information loglarımızın düştüğünü görmekteyiz.
Logla ilgili anlatacaklarım şimdilik bu kadar başka yazımızda devamı gelecek iyi çalışmalar dilerim.
Projenin kodlarında pek bir şey yok ama gene de indirip test etmek isterseniz diye github adresini bırakıyorum.