.Net Core, Docker, ElasticSearch ve Kibana ile Loglama
Merhabalar,
Bu yazımda daha önceden paylaşmış olduğum katmanlı mimari ve generic repository pattern mimarisinin üzerine loglama yapısını nasıl kurduğumu anlatmaya çalışacağım.
Docker ile elasticSearch ve kibana image’larını ayağa kaldırıp, loglama işlemleri için ise serilog kütüphanesini kullanacağım. ElasticSearch, kibana ve serilog tanımlarından bahsetmeden direkt uygulama kısmına geçmek istiyorum. Serilog kısmında daha detaylı bilgiye ulaşmak için benim de faydalandığım buradaki makaleye göz atabilirsiniz.
Docker Container üzerinden Elasticsearch ve Kibana
.NET Core’da kodlamaya başlamadan önce, ilk olarak Elasticsearch ve Kibana containerlarını ayağa kaldırmak önemlidir. Bu containerları ayağa kaldırmanın en kolay yolu, bir docker-compose.yml dosyası oluşturmaktır.
Ardından docker-compose.yml dosyasını oluşturduğumuz klasör içerisinde aşağıdaki komutu çalıştırarak containerları ayağa kaldırmış oluruz.
docker-compose up -d
Docker-compose komutunu ilk çalıştırdığınızda, docker kayıt defterinden ElasticSearch ve Kibana için image’ları indirecektir, bu nedenle bağlantı hızınıza bağlı olarak birkaç dakika sürebilir.
Docker-compose up komutunu çalıştırdıktan sonra, ElasticSearch ve Kibana’nın çalışıp çalışmadığını kontrol edelim.
ElasticSearch ve kibananın çalıştığını gördükten sonra projemize loglama adımlarını ekleyebiliriz. Bunun için öncelikle aşağıdaki nuget paketlerini MusicMarket.Api projemizin içerisine ekliyorum.
- Serilog.AspNetCore
- Serilog.Enrichers.Environment
- Serilog.Sinks.Debug
- Serilog.Sinks.ElasticSearch
dotnet add package Serilog.AspNetCore
dotnet add package Serilog.Enrichers.Environment
dotnet add package Serilog.Sinks.Debug
dotnet add package Serilog.Sinks.Elasticsearch
dotnet restore
Appsettings.json serilog yapılandırılması
Appsettings.json’daki Logging bölümünü kaldırın ve aşağıdaki konfigürasyonla değiştirin, böylece Serilog’a minimum log seviyesi ayrıntı düzeyinin ne olması gerektiğini ve Elasticsearch’e giriş yapmak için hangi url’nin kullanılacağını söyleyebiliriz.
{
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Warning"
}
}
},
"ElasticConfiguration": {
"Uri": "http://localhost:9200"
},
"AllowedHosts": "*"
}
Ardından program.cs dosyası içerisine ConfigureLogging ve ElasticsearchSinkOptions yöntemlerini ekleyelim.
private static void ConfigureLogging()
{
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.WithMachineName()
.WriteTo.Debug()
.WriteTo.Console().WriteTo.File("log.txt", rollingInterval: RollingInterval.Day) .WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment))
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
}
private static ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment)
{
return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"]))
{
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly().GetName().Name.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}"
};
}
Son olarak, CreateHost ve CreateHostBuilder yöntemlerini ekleyelim.
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureAppConfiguration(configuration =>
{
configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
configuration.AddJsonFile(
$"appsettings. {Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json" ,optional: true);
})
.UseSerilog();
Kibana Index yapılandırılması
Kibana henüz herhangi bir log göstermeyecek. Loglara kaydedilen verileri görüntüleyebilmeniz için önce bir index belirlemeniz gerekir. Bunu yapmak için, varsayılan Kibana sayfasındaki Discover bağlantısına tıklayın ve ardından gezinme bölümündeki Index Pattern bağlantısına tıklayın.
Artık, gezinme bölmesindeki discover bağlantısını tıklayarak logları görüntüleyebilirsiniz.
Api katmanı içerisine Log yapısı ekleme
Log düzeyinde veya daha yüksek bir bilgi düzeyine sahip iletileri log’a kaydetmek istediğimizi belirttiğimizden, varsayılan olarak bir dizi bilgi iletisi günlüğe kaydedildi. Ama ya kendi mesajlarımızı kaydetmek istersek? Neyse ki, bunu yapmak oldukça kolay. ArtistsController’ da bir log kaydedeceğim.
ArtistsController.cs dosyasına bir using ifadesi ekleyin
using Microsoft.Extensions.Logging;
Ardından, yapıcı metodu ile bir ILogger instance’ı ekleyelim.
ILogger<ArtistsController> _logger;
public ArtistsController(ILogger<ArtistsController> logger)
{
_logger = logger;
}
Ve son olarak, ArtistsController’ın GetAllArtists metoduna bir loglama kaydedelim. try catch yapısı içerisinde bir hata fırlatalım.
Kibana İçerisinde Arama
Artık bir mesaj kaydettiğimize göre, http: // localhost: 5601'deki uygulamayı tekrar yenileyin. Ardından günlük mesajı metnini arayın.
message: "ArtistsController GetAllArtists"
Çeşitli alanlara karşı hangi bilgilerin günlüğe kaydedildiğini görmek için günlüğü tek bir belge olarak da görüntüleyebilirsiniz.
Kibana’da aramanın ne kadar kolay olduğunu ve ElasticSearch’ün ne kadar güçlü olduğunu göstermek için kullanabileceğiniz birkaç temel arama örneği göstereceğim:
level:"Information"
Log Seviyesi Ayrıntılarını Düşürme
Muhtemelen info seviyesi loglarını biraz fazla ayrıntılı bulacaksınız. Varsayılan olarak, ASP.NET Core, Microsoft Kestrel sunucusu için barındırma ile ilgili logları günlüğe kaydeder. Bu oldukça çok fazla kayıt olmasına sebep olabilir. Loglama ile ilgili olayı hariç tutmanın basit bir yolu, Microsoft günlük düzeyini info olarak ayarlayarak appsettings dosyasını kaydetmektir. İsteğe bağlı olarak, minimum log düzeyini aşağıda gösterildiği gibi varsayılan için error olarak ayarlayarak log kaydını daha da kısıtlayabilirsiniz.
"Serilog": {
"MinimumLevel": {
"Default": "Error",
"Override": {
"Microsoft": "Error",
"System": "Error"
}
}
}
Elasticsearch’e yazmakla birlikte txt dosyasına yazmayı da isteyebiliriz. Bununla için program.cs içerisinde ConfigureLogging metodu içerisine .WriteTo.File(“log.txt”, rollingInterval: RollingInterval.Day) kodu eklenebilir.
Temel giriş seviyesinde anlatmaya çalıştığım yazımın sonuna gelmiş bulunuyoruz :)
Faydalı olması dileğiyle..
Kaynaklar: