Asp.Net Core ElasticSearch Logging ve Kibana Kurulumu & Kullanımı

Daha önceki yazılarda asp.net coreelasticsearchlogging konularına ayrı ayrı farklı örneklerle değinmiştik. Bu yazımızda ise asp.net core projelerinde default logging storage olarak elasticsearch konfigure edip bu elasticsearch'de ki index'lerde bulunan log kayıtlarını Kibana kullanarak nasıl görüntüleyebiliriz örnek proje ile anlatacağız. 

Logging bir uygulama için olmazsa olmazların başında gelmektedir. Uygulama cycle'ın da loglama işlemi doğru zamanda doğru yerde ve en önemlisi bir birine bağlı olacak şekilde yaptığınızda log sonucunda oluşan veri aslında sizin için paha biçilmez bir monitoring aracı olabilir. Analiz yapabilir, alert oluşturabilir, çeşitli raporlar sağlayabiliriz. Bütün bu saydıklarımız ve daha fazlası için çeşitli çözümler sunulabilir ancak şuan ki günümüz yazılım dünyasında ElasticSearch, Kibana with Logstach üçlüsü en performanslı ve open-source olduğundan community'si en sağlam çözüm olarak karşımıza çıkmakta.

Uygulama geçmeden önce bilgisayarınızda .Net Core SDK, ElasticSearch ve Kibana yüklü olmalı. Kurulumlarla ilgili detaylara .Net Core SDK ve ElasticSearch için aşağıdaki başlık altında bulunan yazılarımızdan ulaşabilirsiniz. Kibana kurulumunu ise bu yazımızda anlatacağız.

1) .Net Core Sdk 2.1 Kurulumu

.Net Core SDK 2.1 kurulumunu NET Core 2.0 to 2.1 Migration yazımızda anlatmıştık ve bu yazıda belirtilen instraction'ları takip ederek sdk kurulunu sağlayabilirsiniz.

2) ElasticSearch Kurulumu

ElastciSearch kullanabilmek için bu yazıda anlatıldığı gibi kurulum işlemlerini yapıp kurulumun doğru olup olmadığını test etmek adına browser üzerinden  http://localhost:9200/ adresine httpget isteği yaptığınızda kurulu olan es'ün bilgilerini görüntüleyebilirsiniz.

3) Kibana Kurulumu

Kibana kurulumu için elastic.co adresinde yer alan download sayfasından Kibana için ilgili işletim sisteminize ait dosyaları download edelim. Ben local'de windows kullandığım için Windows uyumlu versiyonu indirdim.

Download işlemi bittikten sonra rar'lı dosyaları ben C sürücüsünü seçtim extract edelim. Extract ettikten sonra C:\kibana-6.3.2\bin klasöründe bulunan kibana.bat dosyasını run edip kibanayı start etmesini bekleyelim. Dilerseniz Kibanayı işletim sistemine service olarak register'da edebilirsiniz.

Kibananın çalışıp çalışmadığından emin olmak için browser üzerinden http://localhost:5601 adresine giderek ulaşabilirsiniz. Elasticsearch'te index oluşturduktan sonra kibana'ya tekrar döneceğiz.

4) Asp.Net Core Api Proje Oluşturulması

Artık örnek projemizi geliştirmeye başlayalım. İlk olarak vs'da ProductApi adında bir Asp.net core 2.1 Web Api projesi oluşturalım.

Projeyi oluşturduktan sonra nuget'ten indirip kullanacağımız kütüphaneleri projemiz için kuralım. Uygulama loglarını atarken Serilog kütüphanesini ve onun ElasticSearch ve .net Core için olan extension dll'lerini projemize nuget üzerinden bulup ekleyelim.

Yukarıdaki paketlerin nuget üzerinden kurulum işlemleri tamamlandıktan sonra projede yer alan Startup.cs sınıfı içerisinde serilog ve elasticsearch için gerekli olan logging konfigurasyonlarını aşağıdaki gibi yapalım. İlk olarak ConfigureServices metodunda serilog ve serilog'un storage olarak elasticsearch'ü kullanacağını belirten kod bloğunu aşağıdaki gibi yazalım.

public void ConfigureServices(IServiceCollection services)
{
    Log.Logger = new LoggerConfiguration()
        .Enrich.FromLogContext()
        .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/"))
        {
            AutoRegisterTemplate = true,
        })
        .CreateLogger();

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

Sonrasında ise Configure metodunda yukarıda ilgili tanımlamalarını yaptığımız serilog'u LoggerFactory'e ekleyip uygulamanın serilog üzerinden logging yapacağını belirttiğimiz kısmı yazalım.

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    loggerFactory.AddSerilog();//serilog servisini eklediğimiz yer

    app.UseMvc();
}

Kurulumlarımızı ve proje geliştirme adımlarını tamamladık artık projemizi run ederek örnek olarak bir ProductController açıp içerisinde bulunan Get metoduna ürün isimleri girmiştim browser üzerinden http://localhost:60506/api/product adresine httpGet isteği attığımızda aşağıdaki gibi ürün isimlerini listelediğini göreceğiz.

[Route("api/[controller]")]
[ApiController]
public class ProductController : ControllerBase
{
    // GET api/product
    [HttpGet]
    public ActionResult<IEnumerable<string>> Get()
    {
        return new List<string> { "Mobile Phone", "Laptop", "Books", "Shoes" };
    }
}

Uygulamada minimum log level Information olduğundan hem uygulama start event'leri hemde end-point'e yaptığımız request-response'a ait log mesajlarını şuan elasticsearch'de logstash-yyy.MM.dd (logstash-2018.07.26 gibi.) formatında bir index oluşturup bu index'e günlük olarak insert etmiş bulunuyor. Bu index'in yaratılıp yaratılmadığını anlamak içinse yine browser üzerinden elasticsearch'ün api'sine istekte bulunarak öğrenebiliriz. Browser'dan http://localhost:9200/_cat/indices?v adesine httpGet isteği yolladığınızda yukarıda bahsettiğimiz formatta index'in oluştuğunu göreceksinizdir.

Şimdi ise son adım olarak index'lemiş olduğumuz bu logları Kibana üzerinde görüntüleyelim. http://localhost:5601 adresine gittiğimizde şuan için herhangi bir index tanımlaması yapmadığımızdan hiçbir şey görüntülenmemekte. Bunun için Kibana'da sol menüde yer alan Management sayfasına giderek Index Patterns ekranında Index pattern textbox'ına "logstash-*" yazarak Next dedikten sonra çıkan ekranda Time Filter'ı log hangi property'ye göre yapacağını belirttiğimiz dropdown'dan @timestamp field'ını seçip Create Index Pattern butonuna tıkladıktan sonra logstash- formatına uygun bütün indexleri Kibana'ya tanımlamış olduk.

 

Indexlemiş olduğumuz logları görüntüleyebilmek için yine sol menüden Discover sayfasına giderek zaman filtresine göre aşağıdaki gibi uygulamamıza ait logları görebiliriz. Dilersek search box'ı kullanarak log içersiinde aramak istediğimiz bir metni kolayca arayabilir yada uygulamanın throw ettiği exception'lar için dashboard'lar tanımlayıp daha metric'ler kullanarak kolayca görüntüleyebiliriz. 

 

Geleneksel logging tekniklerinde genelde erişilmesi ve anlaşılması zor içinde kaybolunabilen yapılar söz konusuydu. Öyle ki log dosyaları arasında aradığımız bir text'i bulmak bazen saatlerimizi bile alabilmekteydi. Ancak elasticsearch ve kibana bunu tamamiyle değiştirdi desek yanlış olmaz. Bu ikili ile birlikte uygulamanızın ürettiği günlük yüzlerce megabyte'lık log text'ini elasticsearch'e index'leyip çok rahat ve hızlı bir şekilde kibana üzerinden erişebilirsiniz. X pack kullanarak çeşitli alert yapıları tasarlayabilir uygulamanızla ilgili herhangi olağan dışı bir durumda en hızlı şekilde kolayca haberdar olabilirsiniz. 

Source Code

Comments (3) -

  • Anlatım için teşekkür ederim giriş seviyesinde tam ihtiyacım olan makaleydi.
  • Merhaba,
    Yazı için teşekkürler oldukça faydalı oldu.
    Ben denemdim fakat şöyle bir problemim var;
    Microservis bir yapıda bütün mikroservislerin loglarını elastichsearche aktarmak istiyorum.

    Bir servis için loglamayı yazdım o servis kendi loglarını gönderiyor başarılı bir şekilde yazıyorum fakat aynı konfigürasyonlarla diğer servisleri elastichsearche baktırdığımda onlar loglarını basmıyor.

    Sizce neden kaynaklanıyor olabilir?
    • Değerli yorumun için teşekkürler. Bir conf. eksiği var gibi geldi, detay paylaşman mümkün mü ? Email de atabilirsin canertosuner@gmail.com

Add comment