.Net Core’da Serilog İle Elasticsearch Sink’inin Kullanımı

Elif BAYRAKDAR
4 min readNov 22, 2020

--

Herkese merhaba,

Loglama canlıda olan her yazılımın olmazsa olmaz ihtiyacı. Bir sorun varsa ve sorunu çözmek için hata detaylarına ihtiyaç varsa veya çalışan bir sistemden bazı bilgiler elde etmek istiyorsak bunları hem loglayıp hem de monitor etmeye ihtiyacımız olmaktadır.

Bu yazımda Serilog kullanarak loglarımızı Docker container’da çalışan Elasticsearch’e yazacağız ve de yine Docker container’da çalışan Kibana’da bu loglarımızı görüntüleyeceğiz.

Serilog’dan biraz bahsedeyim. Serilog .Net/.Net Core platformlarında çalışan diagnostic loglama kütüphanesidir. Esasında bir logger provider’dır. Loglarımızı kaydedebileceğimiz ortam olan sink konusunda çeşit olarak oldukça zengindir. İster dosya sink’ine ister bir veritabanı sink’ine, isterse de Elasticsearch sink’ine loglarımızı yazabiliyoruz. Serilog’un tüm sink’lerine buradan erişebilirsiniz. Yazılım geliştiricilere structured logging imkanı da sağladığı için loglarımızı okurken anlamlandırabilmemiz için oldukça faydalıdır. Structured logging konusuna kodlamaya geçtiğimizde kısaca değineceğim.

Öncelikle Elasticsearch ve de Kibana için kurulum yapmamız gerekiyor. Bunun için en basit yol Docker kurulu sistemimizde bunları bir container üzerinde koşturmak. Bunun için yeni bir dizin oluşturup aşağıdaki şekilde bir docker-compose.yml dosyası oluşturalım:

Bir tane de environment dosyası (.env) oluşturalım aynı dizinde ve Kibana ile Elasticsearch için hangi versiyonun indirileceği bilgisini buraya yazalım:

Burada sadece compose file’da bulunan ${TAG} kısmı için ekleme yaptım ben. Böyle bir dosya oluşturmaktansa compose dosyasındaki ${TAG} kısmı yerine direkt olarak buradaki versiyonu yazabilirsiniz, bu sizin alışkanlıklarınıza bağlı.

Bu kısım da tamamsa komut satırında bu dosyaların olduğu dizine gidip “docker-compose up” komutunu çalıştırmanız yeterli. Containerların ayağa kalkıp kalkmadığını “docker ps -a” çalıştırarak kontrol edebilirsiniz.

Compose dosyamıza göre Elasticsearch 9200 portundan yayın yapıyor. http://localhost:9200 Url’i le kontrol edilebilir. Kibana ise 5601 portundan yayın yapıyor. http://localhost:5601 Url’i ile kontrol edilebilir. Container’lar ayakta ise kod yazmaya başlayabiliriz

Bir tane Asp.Net Core Web Api oluşturdum ve aşağıdaki nuget paketlerini projeye ekledim:

Serilog.AspNetCore

Serilog.Sinks.Elasticsearch

Bu paketleri indirdiğinizde proje referansları şuna benzer olmuş olmalı:

Gelelim kod kısmına. İlk olarak appsettings.json dosyasının içini şu şekilde değiştiriyorum:

Ben bu yazımda tüm ayarlamaları kodda yapacağım, appsettings.json dosyasında da yapılabildiğini not düşüyorum.

Program.cs kısmı aşağıdaki gibi:

Burada öncelikle configurasyon’u build edip logger’ı oluşturmaya başladım. Minimum level’i Debug ayarlayıp, Microsoft ve System loglarını loglamak istemediğimi belirttim. Hem Console hem de Elasticsearch sink’ine yazacağımı belirttim ve Elasticsearch sunucusu olarak da nereye bağlanacağını appsettings.json’dan almak üzere configuration’ı kullandım. Failure durumumda da bir File sink’ine yazacağını belirttim. CreateLogger ile de logger’ı ayağa kaldırmış oldum. Bu sırada da program ayağa kalkarken atacağı ilk Information logumu yazdım.

CreateHostBuilder içinde de tüm diğer logger provider’ları temizleyip UseSerilog diyerek Serilog kullanmak istediğimi belirttim. try catch kullandığım için host ayağa kalkamazsa da Fatal seviyesinde bunu yazmasını istedim.

İşte bu kadar! Test için de bir tane endpoint oluşturuyorum. Bu endpoint’te hatalı bir işlem yapıp bunu da loglamayı amaçlıyorum:

Burada başta söylediğim structured logging konusuna değineceğim ek olarak. Bu yapıya göre değişken sırasına göre loglama yazılır. Yani önce student, sonra firstNumber ve sonra da secondNumber yazılır. Nesneleri de loglamamızı sağlayan bu yapıya göre; @ işareti kendisinden sonra gelen obje türüne göre sıradaki elemanı serialize etmemize yarıyor. Yani ben {@Student} yazdığım için student isimli objeyi Student class’ına göre serialize edeceğini bilecek. @ işareti yoksa ilgili sıradakiler string’e dönüştürülmeye çalışılır.

Projeyi çalıştırıp endpointi çağırdığımda logları Elasticsearch’e yazmış olacağım. Logların Elasticseach’e akmasından sonra bir index pattern belirlemem gerekiyor. Yoksa içerideki logları göremem. Ben kodda bi index pattern belirlemediğim için logstash-* patterni ile loglar yazıldı:

Ben de bu pattern’deki bir index’i ekleyip sonraki adıma geçiyorum:

Burada timestamp de ekledikten ve Create index pattern dedikten sonra index’im hazır:

Son olarak bu index için yazdığımız loglara bir bakalım:

Detay loglar:

--

--

Elif BAYRAKDAR
Elif BAYRAKDAR

Responses (1)