Seri logla Seq’e aksın(Asp.Net Core + Serilog + Seq)

Merhaba arkadaşlar, son zamanlarda sıklıkla kullandığım (hatta kullanırken keyif aldığım diyebilirim :)) ve .NET Application Architecture’ın en popüler referans app’lerinden olan eShopOnContainers içerisinde de kullanılan ikiliden bahsedeceğim.

.Net Core Environment içerisinde logging işlemi için güçlü structured event log yapısı ile dikkat çeken Serilog’u incelemenin yanısıra Serilog ile topladığımız verileri Seq ile nasıl visualize edeceğimize bakacağız.

Serilog

Serilog .Net Evironment için hazırlanmış open source bir logging library diyebiliriz. Evet söylemesi çok basit ama nedir bu Serilog’u öne çıkaran şey dediğinizi duyar gibiyim 🙂

Unlike other logging libraries, Serilog is built with powerful structured event data in mind.

Structured event data yapısı var ama bana göre konfigürasyonu basit, kolay imlemente edilebilir, güçlü filtering yapısı ile birlikte başarılı sinkleri ile de ön plana çıkıyor.

Serilog.Sinks: Serilog çıktılarını kayıt ettiğimiz data platformları Serilog.Sinks altında toplanıyor. .Net evorinment içersinde popüper olan Log4Net tarafındaki appender olarak düşünebilirsiniz. Serilog’un Sink’i olmayan bir data platformu göremedim diyebilirim.

Datalus/Seq

Machine data, for humans.

Kısaca topladığınız logları görselleştirdiğiniz bir platform diyebilirim ancak az kalır 🙂 Görselleştirmesi yanında aslında log datasını tutma tarafını da kendi üstleniyor.(Populer olan Elk ve Kibana ikilisinin görevlerini tek başına üsteleniyor). Kendi Search ve filtering yapısı olması yanında dilerseniz sql query’ler ile kendi chartlarınızı oluşturup izlemeye koyulabilirsiniz. Son olarak istediğiniz takdirde Alertler oluşturup mail veya sms gönderebilir yada entegre paketlerini kullanıp Thirdparty bir uyguma üzerinden issue açabilirsiniz.

Serilog Sink olarak Seq kullanacağım. Eğer onpromise olarak kurmak isterseniz buradanadımları takip ederilirsiniz. Eğer bilgisarınızda docker yüklü ise benim gibi aşağıdaki komutları çalıştırarak docker container olarak ayağa kaldırabilirsiniz.

docker run --name seq -d --restart unless-stopped -e ACCEPT_EULA=Y -p 5341:80 datalust/seq:latest

İlgili komutu çalıştırdıktan sonra http://localhost:5341 adresini ulaşmaya çalıştığınızda aşağıdaki ekran ile karşılaştıysanız herşey doğru gitmiş demektir 🙂

Basit konfigurasyonu sayesinde kolay implemente edilebilir demiştik. Dilerseniz appsettings.json üzerinden config ayarlarını yapıp imlemente edebilirsiniz. Ama ben runtime’da program.cs tarafında yapacağım. appsettings.json tarafında yapmak isteyenler buradaki adımları izleyebilir.

Not: Asp.net core proje tecrübesi olduğunuz varsayılmıştır.

Öncelikle Serilog.AspNetCore paketini projemize yüklüyoruz.

dotnet add package Serilog.AspNetCore

Daha sonra konfigürasyona başlayabiliriz.https://feyyazacet.medium.com/media/685f404a1bd3b916a593439dff79609eProgram.cs

Yukarıda da gördüğünüz gibi o kadar basit. Static olan Serilog.Log.Logger propery için bir LoggerConfiguration instance’ı alıp CreateLogger methodu ile de logger ‘ı ayağa kaldırıyoruz. Son olarak oluşturmuş olduğumuz logger’ı Net.Core pipeline da kullanması için IHostBuilder için yazılmış UseSerilog extension methodunu çağırıyoruz. ConfigureLogging extensions methodu ile de log için serilogdan önce imlement edilmiş proverder’ları temizliyoruz. Bu saatten sonra ILogger interface’ni implemente eden tek provider Serilog.

LoggerConfiguration instance’ı oluşturduktan sonra, CreateLogger methodundan önce ihtiyacımız olan ayarları yapabiliyoruz.

Öncelikle datamızı kayıt edeceğimiz bir sink belirleyelim. Makalemizin başında bunun seq olacağını belirtmiştik. Bunun için Serilog.Sinks.Seq paketini projemize yüklüyoruz.

dotnet add package Serilog.Sinks.Seq

Aşağıda görebileceğiniz gibi WriteTo için yazılmış olan Seq extension methodunu çağırıp Seq linkini vermemiz yeterli.https://feyyazacet.medium.com/media/728186ff48831104726f1565586bcea4

Uygulama içerisinden alacağımız log’lar için level belirleyebiliyoruz. 6 farklı log level belirleyebilirsiniz. Bunun detayına girmeyeceğim. Aşağıdan görebilirsiniz.

Minimum log seviyesini Information olarak ayarlyacağımızı varsayalım. Konfigürasyonumuzu aşağıdaki gibi güncellememiz yeterli.

Not:MinumLevel belirtmezsek default olarak Information set edilmektedir.https://feyyazacet.medium.com/media/00053917c1d0327f85ad1a4c9c35874c

Yine başarılı filter’ing yapısından bahsetmiştim. MinimumLevel olarak Information belirtmemizin yanında Serilog’a Microsoft.AspNetCore namespace’i içerisinde MinimumLevel Warning olsun diyebiliyoruz.https://feyyazacet.medium.com/media/5ea412531a2cb4e03d3c7fc0b6f1996a

Birde Enricher’lar var. Enricher’lar basit olarak log eventlere sabit veya dinamik property eklemek için kullandığımız yapıdır diyebiliriz.

Loglarımızın Seq içerisinde toplanacağından bahsetmiştik. Birden fazla proje için aynı yere log aldığımızı varsayalım. Proje ve environment loglarımızı ayırmak için AppName ve Environment propery’sini ekleyelim.https://feyyazacet.medium.com/media/aba03eff112cc04c7328603462a200ca

Artık uygulama içersinde aldığımız tüm loglarda bu property’ler otomatik olarak set edilecektir. Birde dynamic olarak bunu yapabileceğimiz belirtmiştik. Yani logevent oluşup kayıt edilmeden önce alacağı bir value varsa bu yapıdan yararlanabiliriz. Tek yapmamız gereken ILogEventEnricher interface’ini imlement eden bir class oluşturup Enrich.With ile instance’ini vermek.

LogEvent ile birlikte ThreadId’mizi kaydetmek istediğimiz farzedelim. Öncekle class’ımızı oluşturalım.https://feyyazacet.medium.com/media/198972b47c798a5edbd7a8a43f6776d4

Daha sonra konfigüre edelim.https://feyyazacet.medium.com/media/b96e0a1ac8bde02b42345593f251c25c

İşte bu kadar. Konfigürasyonu burada tamamlıyorum. Artık loglarımızı almaya başlayıp Seq ile visualize edebiliriz.

Pekala öncelikle düz text olarak log almaya başlayalım. Proje oluştururken default olarak gelen HomeController üzerinden çalışmaya devam ediyorum.https://feyyazacet.medium.com/media/6a7d38fb694546d3454ccded0ba554b1

Projemizi çalıştırdıktan sonra http://localhost:5341 üzerinden almış olduğumuz loglara bakalım. Seq ekranını açtığımızda .Net core mühendislerinin sistem aşamasında bizim için yazmış oldukları bazı logları da görebilirsiniz 🙂

Yeri gelmişken: .Net Core’u yazan ekibi de mükkemmel trace mekanizması için tebrik etmek lazım. Adamlar olayı çözmüş 🙂

Seq Log screen

Seq’i de övmeye başlayabiliriz. Ana ekranda direk filteleme yapabilceğimiz alan mevcut ve HomeController arattığınızda, eklediğmiz property’leri value’ları ile birlikte görebilirsiniz.

Tabi olay bununla bitmiyor. Serilog’un en çok sevdiğim kısmına geliorum. Diyelim runtime da bir variable var. Bu variable’ın value’sunu loglamak istiyoruz.

Not: Loglarımı Index action içerisinde almaya devam edeceğim.https://feyyazacet.medium.com/media/9eb8f1752ef894635fee0be8a0d2fa06

Şimdi tekrar çalıştıralım. Bakalım neler göreceğiz. Evet Serilog’un harikalar diyarına hoş geldiniz. {} içine yazdığımız her ne ise ayrı bir propery olarak ekleyip value atamasını yapmaktadır. Yani?

Hello {Name} için alınan log’u seq ekranı kontrol ettiğinizde Name propery’sinin eklenip value olarak Feyyaz atamış olduğunu göreceksiniz.

Hello {CompanyName} bakacak olur isek CompanyName propery’sini ekleyip value olarak da Tetris Solutions atamış.

Yeri gelmişken Seq’in search faydalarından da bahsedelim. Bir süre sonra Name için arama yapmak isterseniz Name=”Feyyaz” yazmanız yeterli. Sadece Equals olarak değil Contains, EndWith, veya, StartWith olarak da arama yapabiliyorsunuz.

Serilog’un harikalar diyarı burada bitmiyor. Firmayı tüm bilgileri ile loglamak istediğimizi varsayalım.https://feyyazacet.medium.com/media/b67c169c0ac23fde30ead38b702ae134

İşin içine birde @ giriyor. İşte bu durumda Serilog bunun bir complex Type olduğunu anlayıp serialize ediyor. Yani Company adında bir property ekleyip value olarak serialize edilmiş halini kayıt ediyor.

Seq içerisinde serialize edilmiş veriyi Property.Attribute olarak arayabilirsiniz. Company.TaxNumber=”xxxxxxxx” için arama yaptığınızda aşağıdaki gibi sonuca ulaşırsınız.

Sonuç

Günümüz mimarilerde loglama olmazsa olmaz yapılarımızdan olup bu dataları anlamlı hale getirmek de kaçınılmazdır. Bu noktada Serilog ile log mekanizmanızı oluşturup Seq ile de bu dataları analiz edip veya çeşitli alert yöntemleri uygulamanızın durumundan haberdar olabilirsiniz.

Ref : https://feyyazacet.medium.com/seri-logla-seqe-aks%C4%B1n-asp-net-core-serilog-seq-ec2d687ecf64

Paylaştıkça Artan Tat...

Bir yorum ekleyin

E-posta hesabınız yayımlanmayacak.