Logging in net6 (Providers,LogLevels,Configuration,ILogger<T>)
.net core Factory ve provider pattern kalıplarına uyan bir loglama yapısına sahiptir. Bu sayade genişleyebilir bir yapı sunmaktadır.
Varsayılan olarak console ,debug, eventlog,eventsource ve tracesource gibi providerlarıyla loglama yapmamıza imkan verir.
Örneğin eventlog provider’ı ile windows event viewer a log ekleyebiliriz. Hatta kendi providerımızı yazarak loglarımızı bir veri tabanına veya dosyaya yazabiliriz.
Makalemimiz bu bölümündeki kazanımlar
Default providers
Log levels
Log level configuration
ILogger<T>
Log Levels
Yazılımımızda bir çok amaç için loglama yapabiliriz. Olası loglama durumları “log level” olarak ayrıştırılmıştır.
Trace : Geliştiricinin sadece geliştiriciler için eklediği loglar .
Debug : Sadece debug anında gözükmesini istediğimiz loglar.
Information : Uygulama akışında bilgi amaçlı loglar. Örneğin efcore sql queryleri bilgi olarak loga eklemesi.
Error : Uygulamada oluşan hataların loglanması.
Critical : Anında müdahale edilmesi gereken durum bilgileri
Log Providers
.net core default log provider “Console” dur. Bir log eklediğimizde bunu application consoleda görürürüz.
Provider’ı Debug olarak değiştirdiğimizde logların application consoleda değil debug consoleda oluşturğunu görürürüz.
var builder = WebApplication.CreateBuilder(args);builder.Logging.ClearProviders();builder.Logging.AddDebug();
Log Level Configuration
Loglarımızın windows event loga atmak için providerımızı değiştirelim.
var builder = WebApplication.CreateBuilder(args);builder.Logging.ClearProviders();builder.Logging.AddEventLog();
Atık loglarımızın windows event loga gitmesini bekliyoruz. Fakat uygulamamızı çalıştırıp eventlogu kontrol ettiğimizde ilgili log kaydının oluşmadığını görürüz.
_logger.LogInformation(“Log ekledim”);
Home Controller da eklediğimiz bu log neden provider tarafından es geçildi ?
Log levelimizi error seviyesine çekelim.
_logger.LogError(“Log ekledim”);
Event logu kontrol ettiğimizde. İlgili log kaydını görürüz.
Neden information log level kayıdı eklenmedi error log kaydı eklendi diye düşündüğümüzde :
appsettings.json içinde bulunan Logging configurasyonu buna cevap olacaktır.
Uygulamada eklenen tüm “Information level” ve üzeri seviyedeki logların default olarak değerlendirmeye alınması istenmiş. Microsoft.AspNetCore namespace i içinde bulunan loglardan ise “Warning level” ve üzeri loglanması istenmiş.
Bu konfigurasyon bize mükkemmel bir yenetenek sağlamaktadır. Örneğin development yaparken trace level ve üzeri tüm logların görünmesini isterken production da sadece error level ve üzeri logların değerlendirilmesini isteyebiliriz. Hatta bunu namespace bazlı farklı set edebiliriz.
EventLog için Information ve üzeri level logların değerlendirmeye alınmasını istedik.Event viewerı kontrol ettiğimizde .net runtime tarafından information ve warining log kayıtları eklendiğini görürüz.
ILogger<T>
Loglama yapmamızı sağlayan methodlar ILogger interface’i ile depedency injection ile sağlanır.
Constructor injection, Action injection , Middleware injection ve Viewinjection ile Logger intance ı alınabilir.
Buradaki T loglamanın kategorisini ifade eder.
Örneğin constructor injection yöntemiyle HomeController kategorisi için loglama yapan bir instance oluşturulur.
Log konusuna devam ettiğimiz makaleler:
Part2: SeriLog, SeriLog.Sinks