.Net 6 Serilog Ve Graylog Entegrasyonu

Asrin Ziya Hocaoglu
inventiv
Published in
5 min readJan 19, 2023

Makalede .Net 6 projelerinde Serilog, Serilog’da Enrichers ve Sinks kavramları özelinde .Net 6 entegrasyonu nasıl yapılır konusu, Graylog tarafında logların görüntülenmesi için uygulanması gereken adımlar ele alındı.

Serilog Nedir?

Serilog, loglama yetenekleri sağlayan üçüncü parti bir .Net kütüphanesidir. Kullanımı kolay, esnek ve çok çeşitli loglama senaryolarına destek sağlayacak şekilde tasarlanmıştır. Serilog ile loglar konsol, metin dosyaları, veritabanları ve bulut tabanlı kayıt hizmetleri gibi çeşitli hedeflere kaydetmek için kullanılabilir. Serilog, geliştiriciler arasında oldukça popülerdir ve birçok uygulamada ve sistemde kullanılmaktadır.

Neden Serilog? Rakiplerine Göre Avantajları Nelerdir?

Dokümantasyonu ve topluluğu, türevlerine göre daha iyidir. Yapılandırılmış log ve enrich özellikleri ile ön plana çıkar. .Net tabanlı konfigürasyona sahiptir.

Yapılandırılmış (Structured) Loglama

Serilog’da kaydedilen değerin ismini bilmek ve bunu arayabilmek, Serilog’u diğer loglama kütüphanelerinden ayıran bir özelliktir.

log.Info(“Datetime is {@dateTime}”, dateTime);

Serilog Enrichers

Loglara property ekler ve bu sayede loglardaki bilgiler zenginleşmiş olur. Eklenilen enricherlar, sabit olarak her logda kullanılır.

NuGet’ten aşağıdaki görselde sık kullanılan “Enrichers” paketleri gözükmektedir. Tercihe göre zenginleştirilmek istenilen property’e uygun paket eklenebilir.

Serilog Sink

Log; veri tabanları, konsol ve Graylog gibi birçok kaynağa atılabilir.

Serilog Sink, hangi kaynağa log atacağımızı belirlememizi sağlayan yapıdır.

Örneğin; Sink yapısı ile yukarıdaki kod parçasında Serilog ile atılacak loglar, Graylog ve konsola basılacak şekilde ayarlanmıştır.

.Net 6' da Serilog Entegrasyonu

Serilog’u .Net 6 projesinde kullanmak için ilk yapılması gereken gerekli NuGet paketini terminal kullanarak ya da “Nuget Package Manager” ile projeye eklemek gerekmektedir. Bu uygulanacak örnekte ‘Serilog’ kütüphanesi kullanarak ‘Graylog’ sunucusuna log atılmaya çalışılacaktır. Bundan dolayı ‘Serilog.Sinks.Graylog’ kütüphanesinin de projeye eklenmesi gerekmektedir.

Graylog hakkında Daha Detaylı bilgiye ulaşmak için “Graylog Genel Kullanım Rehberi” adlı makalemizi okuyabilirsiniz.

1. Serilog Kurulumu

1.1 Terminal Aracılığıyla

dotnet add package Serilog
dotnet add package Serilog.Sinks.Graylog

1.2 Nuget Package Manager Aracılığıyla

2.Serilog Program.cs Konfigürasyonu

İlk öncelikle “Serilog” kütüphanesi Program.cs sınıfının using kısmında “Using Serilog;” denilerek çağırılır ve kullanıma hazır hale getirilir

using Serilog;

Aşağıdaki örnek kod parçacığında serilog.json dosyasında bulunan konfigürasyonlar, configuration değişkeni üzerinden LoggerConfiguration’a “ReadFrom” ile uygulanmıştır

//!Serilog Configuration
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile($"Serilog.json", false)
.AddJsonFile($"Serilog.{env}.json", true)
.Build();

Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("CustomProperty", "My Application")
.Enrich.WithProperty("Version", "v01.00")
.CreateLogger();

builder.Host.UseSerilog();

3. Serilog.json konfigürasyon dosyasının oluşturulması

{
"Serilog": {
"Using": [ "Serilog.Sinks.Graylog" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Error",
"Microsoft.AspNetCore": "Error",
"System": "Error",
"Microsoft.Hosting.Lifetime": "Error",
"Microsoft.Extensions.Hosting": "Error",
"MyApplication": "Warning"
}
},
"WriteTo": [
{
"Name": "Graylog",
"Args": {
"hostnameOrAddress": "127.0.0.1",
"port": "12201",
"transportType": "Udp",
"restrictedToMinimumLevel": "Information"
}
}
],
"Enrich": [
"FromLogContext",

//Environment
"WithMachineName",
"WithEnvironmentUserName",
"WithEnvironmentName",

//ClientInfo
"WithClientIp",
"WithClientAgent",

//Process
"WithProcessId",
"WithProcessName",

//Thread
"WithThreadId",
"WithThreadName",

//CorrelationId
"WithCorrelationId",

//Memory
"WithMemoryUsage",

//ExceptionalLogContext
"WithExceptionalLogContext"
],
"Properties": {
"Application": "My Application"
}
}

“Using” => Kısmında hangi “Sinks” kütüphanesinin yada kütüphanelerinin kullanılacağı yazılır.

”MinimumLevel” => Kısmında ise log seviyesi yazılır ve bu sayede istenilen seviyelerin sunucuya göndermesi sağlanır.

“WriteTo” => Kısmında logların basılacağı sunucu ile ilgili bilgiler (Host adresi , host portu) ve transfer tipi yazılır.

Log Atılma Örneği

 public ActionResult Get()
{
var user = "Asrın";
var timeStamp = DateTime.UtcNow;

_logger.LogWarning("WARNING message for monitoring on graylog test integration {TimeStamp} {User} ", timeStamp, user);
_logger.LogInformation("INFO message for monitoring on graylog test integration {TimeStamp} {User} ",timeStamp , user);
_logger.LogCritical("Critical message for monitoring on graylog test integration {TimeStamp} {User} ", timeStamp, user);
_logger.LogError("Error message for monitoring on graylog test integration {TimeStamp} {User} ", timeStamp, user);


return Ok();
}

Graylog Attırılan Logların İzlenmesi

Push Property & With Property Özelliğinin Kullanımı

Serilog kütüphanesinin geliştiriciye sunduğu “WithProperty” ve “PushProperty” metodları ile yeni bir özellik eklenebilmektedir.

Geliştirici logda görmek istediği sabit bilgileri “WithProperty” kullanarak ekleyebilir. Program.cs de konfigürasyonları yapılır. Çalışma zamanında değişen özellikler için ise “PushProperty” kullanılır . Böylelikle geliştirici dinamik bir property yapısına sahip olur.

Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.FromLogContext()
.Enrich.WithProperty("Environment", configuration)
.Enrich.WithProperty("LoggingToGraylog", "True",true)
.CreateLogger();

Örnekte de görüleceği üzere “LoggingToGraylog” adında ve “True” değerine sahip bir property log mekanizmasına “ WithProperty() ” metodu ile eklenmiştir.

PushProperty ise geliştiricinin var olan log’unu run time anında anlık değişiklikleride göz önünde bulundurarak zenginleştirmesidir. Bu sayede program çalışır esnadayken herhangi bir özellik PushProperty ile loglara pushlanarak gerekli sunucuda rahatça izlenebilir. Böylelikle geliştirici dinamik bir property yapısına sahip olur.

LogContext.PushProperty("DayOfLog", DateTime.Now.Day);
LogContext.PushProperty("HourOfLog", DateTime.Now.Hour);

Örneğin; çalışma zamanında “DayOfLog” ve “HourOfLog” isimleri ile verileri eklediğimizde Graylog sunucusundaki çıktı aşağıdaki şekilde olacaktır.

Bir de Graylog sunucusunda ki çıktıyı incelemek gerekirse

Serilog’da Log Seviyeleri

a. Verbose : Ayrıntılı; Uygulama için nadiren etkinleştirilen detay bilgilerden oluşan log seviyesidir.

b. Debug : Hata Ayıklama; Dışarıdan gözlemlenebilir olması gerekmeyen, ancak bir şeyin nasıl olduğu belirlenirken yararlı olan sistem log seviyesidir.

c. Information : Bilgi; Sistemde meydana gelen ve sistemin sorumluluklarına ve çalışmasına karşılık gelen loglardır. Genel olarak sistemi izleme amacıyla kullanılan log seviyesidir.

d. Warning : Uyarı; Sistem bozulduğunda, tehlikede olduğunda veya beklenen parametrelerin dışında davrandığında kullanılan log seviyesidir.

e. Error : Hata; Sistemde gerekli fonksiyon kullanılamadığında veya beklenen dışı davranış sergilendiğinde kullanılan log seviyesidir.

f. Fatal : Ölümcül; Sistemde anında ilgilenilmesi gereken en kritik log seviyesidir.

Makalemiz sonucunda Serilog kütüphanesini kullanarak logların belirli bir yapıda basılması sağlandı.

KAYNAKÇA

Bu makalede emeği geçen Arif Emre Yazıcıoğlu ve Mahmut SAZLIK’a teşekkürlerimi sunarım.

--

--