.NET’de Serilog, ElasticSearch ve Kibana Kullanımı
Bu yazıda sizlere .NET’de loglarımızı nasıl ElasticSearch ile tutabiliriz ve bunları görselleştirmek için Kibana’yı nasıl efektif kullanabiliriz sorularına yanıt vermeyi amaçlıyorum. Loglama için Serilog kütüphanesini kullanarak, basit bir örnekle açıklayacağım. İlk olarak tanımlamaları yapıp, ardından proje örneği ile bunu örneklendireceğim. Loglama ile ilgili ileri seviye detaylara burada değinmeyip, sadece Elasticsearch ve Kibana üzerinden log görüntülemeye odaklanacağım. Projenin kaynak kodlarına buradan ulaşabilirsiniz.
Logging Nedir?
Loglama yazılım uygulamalarımızın geliştirilmesi, bakımı ve yeni özellikler eklerken ortaya çıkabilecek sorunların, bilgilendirmelerin kayıt altına alınmasıdır. Log verileri sayesinde monitoring yapabiliriz. Analiz yapabilir, çeşitli raporlar ortaya koyabilir ve sorunların çözümünde doğru yaklaşımlar benimseyerek zaman kazanabiliriz.
Serilog Nedir?
Serilog bir .NET kütüphanesidir. Loglamayı basite indirgeyen bir kullanışı mevcuttur. Diğer kütüphanelerden ayrılan özelliği “structured logging” özelliği bulunmasıdır. Bu sayede, verilerimizi nesne yapısında loglayabilir ve bu yapıdaki bir veriyi kolayca sorgulayabiliriz. Serilog için 2 mantık mevcuttur; bunlardan biri Core Serilog Logic, diğeri ise Sinks’lerdir. Logic loglama mantığımızı sinks ise log verilerimizi nereye yazacağımızı belirler. MySQL, Elasticsearch vb. bir çok mevcut sinks yöntemi vardır. İhtiyaca göre belirlenebilir. Bu projede yalnızca Elasticsearch sinks üstünde durulacaktır.
Elasticsearch Nedir?
Elasticsearch içerik aramayı, veri analizini ve sorgulamayı yapabileceğimiz bir veri indeksleme motorudur. Apache Lucane altyapılıdır ve Java ile geliştirilmiştir. ElasticSearch bir veritabanı olarak düşünülebilir. Perfomansı yüksek olduğundan sıklıkla tercih edilen full-text search motorudur.
Kibana Nedir?
Kibana Elasticsearch için geliştirilmiştir. Elasticsearch’deki verilerimizi görselleştirmeyi mümkün kılar. Datalarımızı bir web arayüzü sayesinde sorgulayabilir, görselleştirebiliriz.
Neden Elasticsearch?
- Açık kaynak kodlu
- REST API
- Basit sorgular
- Hızlı ve perfomanslı
- Ölçeklenebilir
- Belge odaklı (JSON)
Proje Öncesi Hazırlıklar
Projeye geçmeden önce Elasticsearch ve Kibana’yı bilgisayarımıza kurmamız gerekiyor.
Uyarı: Elasticsearch’in stabil çalışabilmesi için diskte yeteri kadar alanın mevcut olması gerekmektedir. İlk kullanımımda bu sorunu yaşadığım ve zaman kaybettiğim için, bu durumun sizin başına gelmemesi adına kurulum için yeterli disk alanınızın bulunduğundan emin olunuz.
Elasticsearch Kurulumu
- Kurulum için buraya tıklayıp, dosyayı indirin.
- İndirilen dosyayı zip’ten çıkartın.
- İndirilen klasör üzerinde elasticsearch/bin dosya yoluna gidip cmd’yi çalıştırın.
- Elasticsearch.bat komutunu yazıp Elasticsearch’i çalıştırıyoruz.
Ardından http:localhost:9200/ adresine gittiğimizde aşağıdaki gibi bir çıktı alınıyorsa, kurulum tamamlanmıştır.
Kibana Kurulumu
- Kurulum için buraya tıklayıp, dosyayı indirin.
- İndirilen dosyayı zip’ten çıkartın.
- İndirilen klasör üzerinde kibana/bin dosya yoluna gidip cmd’yi çalıştırın.
- kibana.bat yazıp çalıştırıyoruz.
Ardınran http://localhost:5601/app/kibana adresine gittiğimizde aşağıdaki gibi bir çıktı alıyorsak, kurulumumuz tamamlanmıştır.
Temel kurulumlar tamamlandıktan sonra kodlamaya geçiş ve projemize gerekli kütüphaneleri ekledikten sonra, loglama işlemini yapmaya başlayabiliriz.
Proje Başlangıcı
Projemizi oluşturduktan sonra gerekli Nuget paketlerini projemize eklememiz gerekmektedir. Bu paketler;
- Serilog.AspNetCore
- Serilog.Enrichers.Environment
- Serilog.Sinks.Debug
- Serilog.Sinks.ElasticSearch
- Serilog.Exceptions
Gerekli Nuget paketlerini projeye dahil ettikten sonra Appsettings.json dosyamıza Serilog ile ilgili config dosyalarını eklememiz gerekmektedir. Burada loglarımızın minimum seviyesini ve Elasticsearch URL’sini belirtmemiz gerekmektedir.
"Serilog": {
"MinimumLevel": {
"Default": "Warning",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"AllowedHosts": "*",
"Elasticsearch": {
"Uri": "http://localhost:9200"
}
Appsettings.json dosyamızı configure ettikten sonra Program.cs dosyasını revize etmemiz gerekmektedir.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using Serilog.Exceptions;
using Serilog.Formatting.Elasticsearch;
using Serilog.Sinks.Elasticsearch;
namespace elasticsearch_kibana_serilog_example
{
public class Program
{
public static void Main(string[] args)
{
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
optional: true)
.Build();
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.Enrich.WithExceptionDetails()
.Enrich.WithMachineName()
.WriteTo.Debug()
.WriteTo.Console()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(configuration["Elasticsearch:Uri"]))
{
CustomFormatter = new ExceptionAsObjectJsonFormatter(renderMessage: true),
ModifyConnectionSettings = c => c.ServerCertificateValidationCallback(
(o, certificate, arg3, arg4) => { return true; }),
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}"
})
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
try
{
CreateHostBuilder(args).Build().Run();
}
catch (System.Exception ex)
{
Log.Fatal($"Failed to start {Assembly.GetExecutingAssembly().GetName().Name}", ex);
throw;
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
}).UseSerilog();
}
}
Ardından projemizi çalıştırıyoruz.
Kibana ile Index Pattern oluşturarak Logları Görüntüleme
http://localhost:5601/app/kibana#/management/kibana/index_patterns/ adresine giderek index pattern oluşturuyoruz. Bu adrese gittiğinizde aşağıdaki gibi bir görüntü alacaksınız, Program.cs’e yazdığımız kodlarda index ismimizin proje ismiyle aynı olmasını yazdığımızdan bunu daha sonra değiştirebilirsiniz.
Oluşturulmuş olan kaydı yazıp, Next Step butonuna tıklayın.
Time filter seçeneğinde @ timestamp değerini seçip Create Index Pattern butonuna tıklayın.
Index’iniz oluşturulduktan sonra soldaki sidebar panelinden Discover alanına tıklayıp loglarınızı görüntüleyebilirsiniz.
Serilog ile loglarımızı kaydetmeyi, Elasticsearch üzerine tutmayı ve Kibana ile görselleştirmeyi başardık. Projelerinizde kullanabileceğiniz kadar açık ve faydalı olması dileğiyle.