Asp.Net Core’da Elasticsearch ve Serilog Kullanarak Merkezi Loglama İşlemleri

Sefik Can Kanber
5 min readSep 15, 2020

Merhaba arkadaşlar bu makalemde Asp.Net Core projemizde Elasticsearch ve Serilog kullanarak merkezi bir loglama sisteminin nasıl kurulacağından bahsedeceğim.

Kısaca kullanacağımız teknolojilerden bahsetmek gerekirse,

Elasticsearch: İçerik arama, veri analizi, sorgulamalar ve öneriler gibi işlemlerde özellikle performans kabiliyetleri, güçlü ve esnek olmasından dolayı tercih edilen full-text search arama motorudur. Java ile geliştirilmiştir ve Lucene altyapılıdır.

Kibana: ElasticSearch için açık kaynaklı bir veri görselleştirme arayüzüdür. Elasticsearch üzerindeki data’ları sorgulayabilir ve grafikler oluşturabilirsiniz.

Serilog: Asp.Net Core’da log’lamayı kolaylaştıran eklentidir. Çeşitli şekillerde log’lama yapabiliriz. Elasticsearch, SQL vs.

Peki bu sistemi tasarlarken ve oluştururken neden Elasticsearch kullandım?

  • Ücretsiz ve açık kaynak kodlu olması,
  • Restfull Api’ye sahip olması. Response’un JSON olarak dönmesi ve bu sayede veri sorgulama ve ekleme işlemlerinin kolaylaşması,
  • Query oluşturmanın kolay olması,
  • Hız ve performans,
  • Ölçeklenebilir (scale) olması,
  • Kurulumunun son derece basit olması.

Projeye başlamadan önce Elasticsearch ve Kibana’yı sistemimize yüklememiz gereklidir. Bunun için direkt kendi bilgisayarınıza kurulum yapabilir ya da aşağıdaki şekilde bir docker-compose.yaml dosyası oluşturarak Docker üzerinden yönetimi sağlayabilirsiniz. Ben docker üzerinden süreci yöneteceğim.

version: '3.1'

services:

elasticsearch:
container_name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
ports:
- 9200:9200
volumes:
- elasticsearch-data:/usr/share/elasticsearch/data
environment:
- xpack.monitoring.enabled=true
- xpack.watcher.enabled=false
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
- discovery.type=single-node
networks:
- elastic

kibana:
container_name: kibana
image: docker.elastic.co/kibana/kibana:7.6.2
ports:
- 5601:5601
depends_on:
- elasticsearch
environment:
- ELASTICSEARCH_URL=http://localhost:9200
networks:
- elastic

networks:
elastic:
driver: bridge

volumes:
elasticsearch-data:

Evet docker-compose’umuz hazır. Detaylı şekilde yukarıda yazdığım komutları açıklamayacağım, eğer isterseniz Docker-Compose Nedir? makalemi inceleyebilirsiniz.

Docker compose’u çalıştırmak için ilgili dizinde;

docker-compose up -d

komutunu çalıştırmamız yeterlidir. Daha sonra docker ilgili image’leri indirip yükleyecektir. İşlemler tamamlandıktan sonra ilgili endpoint’lerden (elasticsearch: http://localhost:9200, kibana: http://localhost:5601) çalışıp çalışmadığını kontrol edebilirsiniz.

Eğer elasticsearch ayakta ve çalışıyor ise aşağıdaki gibi bir response alacaksınız:

Aynı şekilde Kibana ayakta ve çalışıyor ise aşağıdaki gibi bir response alacaksınız:

Evet log’lama işlemlerinde kullanacağımız her şey hazır şimdi kodlamaya geçebiliriz. Basit bir .Net Core Web Api projesi oluşturup başlayalım.

Projemizi oluşturduktan sonra Nuget’ten Serilog için kullanacağımız aşağıdaki paketleri yükleyelim:

  • Serilog.AspNetCore
  • Serilog.Enrichers.Environment
  • Serilog.Sinks.Debug
  • Serilog.Sinks.ElasticSearch

İlgili paketler yüklendikten sonra appsettings.json dosyamızdaki logging bölümünü kullanacağımız serilog bölümüne göre düzenliyoruz:

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

Yukarıdaki bölümü silip, aşağıdaki Serilog bölümü ve Elasticsearch endpointimizin yer aldığı bölümü ekliyoruz:

{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "http://localhost:9200"
},
"AllowedHosts": "*"
}

appsettings.json dosyamızda gerekli değişiklikleri yaptıktan sonra Program.cs’de yapacaklarımıza geçelim.

Main metodu içerisini aşağıdaki şekilde düzenleyelim. Burada, ilk olarak log’lamayı ayarlıyoruz ki olası bir Host oluşturma işlemini Elasticsearch’e yazalım ve hataları takip edebilelim.

ConfigureLogging metodumuz aşağıdaki şekilde olacaktır. Burada, environment bilgisine göre kullanılacak appsettings dosyasını ayarlıyoruz ve Serilog ile Loglama işlemini ayarlıyoruz.

Daha sonra Elasticsearch üzerindeki index formatını oluşturuyoruz. Bunun için Serilog üzerindeki ElasticsearchSinkOptions’ı kullanacağız.

Index’i ayarladığımıza göre son olarak, CreateHost ve CreateHostBuilder metotlarını try-catch ile ekleyelim. (Olası host oluşturma hatalarını yönetebilmek için ekledik.)

Buraya kadar her şey tamam, ancak Kibana şu an herhangi bir log’u göstermeyecektir. Kibana’nın log’larınızı göstermesi için bir index oluşturmanız gerekmektedir. Ben standart olarak ‘*’ ile pattern oluşturacağım. Burada spesifik olarak pattern verebiliriz, ancak ben örnek olması açısından genel bir pattern vermeyi uygun buldum. Kibana üzerinden örnek bir index pattern oluşturmayı göstererek log işlemine devam edelim. Browser üzerinde localhost:5601 url’i ile Kibana arayüzüne gittiğimizde aşağıdaki şekilde bir ekran ile bizi karşılayacaktır:

* İlk olarak sol tab’den discover’a tıklamamız gerekli

Daha sonra index pattern’imizi oluşturalım. Aşağıdaki resimdeki gibi oluşturduğumuz index pattern ismini girebilir ya da özel karakterler kullanabilirsiniz.

Diğer sayfada ise @timestamp, zaman filtresini seçerek index pattern’i oluştur butonuna tıkladığımızda Kibana üzerinde loglarımızı görüntüleyeceğimiz index pattern’i oluşturmuş olacağız.

Şimdi tasarladığımız Log sistemini test edeceğimiz basit bir Controller ve action oluşturalım. Ben aşağıdaki şekilde basit bir HomeController ve Index action’ı oluşturdum.

Projemizi çalıştıralım ve /api/home endpoint’ine postman ile istek atalım.

Daha sonra Kibana arayüzüne gelelim ve Filters alanına message:”index action” yazıp filtreleyerek information logumuzu görebiliriz.

Filtrelediğimiz log’u detaylı olarak incelemek için hemen yanında yer alan (>) işaretine tıklayarak detaylı olarak görebilirsiniz.

Elasticsearch ile Hata Log’larının Kaydedilmesi

Information log’larına benzer olarak akış throw edilip kesildiğinde benzer şekilde serilog ile Elasticsearch’e yazıp Kibana arayüzünde görüntüleyebilirsiniz.

/api/home endpoint’imiz üzerinde küçük bir değişiklik yaparak test edelim:

Şimdi Kibana arayüzüne gidip;

level:error ile filtreleyip exception log’unu görebilirsiniz.

Elasticsearch ve Kibana ile merkezi log’lama konusunda temel düzeyde bilgi vermeye çalıştım.

Faydalı olması dileğiyle.

İyi çalışmalar.

--

--