.Net Core’da Serilog İle ElasticSearch Sink ve Kibana Field Özelleştirmesi-3

Adem Olguner
Devops Türkiye☁️ 🐧 🐳 ☸️
3 min readDec 9, 2022

Bu makale serinin 4.cü yazısıdır. Seriye ait diğer yazıları okumak için altta bulunan linklerden diğer yazılara erişim sağlayabilirsiniz.

1- Docker Ortamlarının ayarlanması
2- Serilog Entegrasyonu ve Konfigürasyonu
3- ElasticSearch Detaylı Kullanım
4- Kibana ve Loglama için Custom Field oluşturma ve Kibana ortamlarında sorgulama

Kibana

ELK yığını nasıl çalışır? Logstash, verileri alır, dönüştürür ve doğru hedefe gönderir. Elasticsearch, alınan verileri dizinler, analiz eder ve bunlarda arama yapar. Kibana, analizin sonuçlarını görselleştirir.

Kibana toplanıp anlamlı hale gelen verinin, analizini yaptıktan sonra ki görselleştirme işlemini yapar.

Kibana özelleştirmesi yapılmadan önce:

1- Management => Stack Management menüsüne gelelim.

2- Kibana altinda Index Pattern alanına tıklayalım

Herhangi bir log olmadığı için ELK tarafında bir index oluşmadı. Projeyi çalıştırıp herhangi bir endpointi çağırdığımızda logları Elasticsearch’e yazmış olacağız.

Sistemde artık loglarımızın olduğunu anlıyoruz. Şimdi bir index pattern oluşturalım.

Logların Elasticseach’e akmasından sonra bir index pattern belirleyebiliriz. Aslında kod tarafında bu patterni oluşturduk ancak farklı patternler ile de bu logların ayrıştırılmasını istersek parklı patternler uygulayabiliriz.

IndexFormat = $"{applicationName.ToLower()}-{DateTime.UtcNow:yyyy-MM}",

Ben de bu pattern’deki bir index’i ekleyip sonraki adıma geçiyorum.

Solution içerisinde sadece bir api projemiz mevcut. Örneğin bir background job projesi daha ekledik bu durumda:

var olan api projesi index
serilogelastickibana.api-yyyy-MM
yeni eklenen backgroundjob
serilogelastickibana.backgroundjob-yyyy-MM

bu şekilde birbirinden farklı indexler oluşturmak için pattern oluşturarak bu ayrımı yapabiliriz.

serilogelastickibana.-* bu şekilde index pattern name verildiğinde farklı projelerdeki farklı loglar farklı indexlerde toplanmış olacaktır.

Burada timestamp de ekledikten ve Create index pattern dedikten sonra index’imiz hazır:

Son olarak bu index için yazdığımız loglara bir bakalım:

SerilogExtension static clasıı içerisinde UseSerilog adında bir metot oluşturalım ve Program.cs içerisinden çağıralım.

Program.cs

var app = builder.Build();
app.UseSerilog();

SerilogExtension.cs


public static WebApplication UseSerilog(this WebApplication app)
{
app.UseMiddleware<ErrorHandlingMiddleware>();
app.UseSerilogRequestLogging(opts => { opts.EnrichDiagnosticContext = EnrichFromRequest; });
return app;
}

private static void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
{
diagnosticContext.Set("CustomField.UserName", httpContext?.User.Identity?.Name);
diagnosticContext.Set("CustomField.ClientIP", httpContext?.Connection.RemoteIpAddress?.ToString());
diagnosticContext.Set("CustomField.UserAgent", httpContext?.Request.Headers["User-Agent"].FirstOrDefault());
diagnosticContext.Set("CustomField.Developer", httpContext?.Request.Headers["developer"].FirstOrDefault());
diagnosticContext.Set("CustomField.Resource", httpContext?.GetMetricsCurrentResourceName());
diagnosticContext.Set("CustomField.MethodType", httpContext?.Request.Method);
diagnosticContext.Set("CustomField.StatusCode", httpContext?.Response.StatusCode);
}

private static string GetMetricsCurrentResourceName(this HttpContext httpContext)
{
if (httpContext == null)
throw new ArgumentNullException(nameof(httpContext));

var endpoint = httpContext.Features.Get<IEndpointFeature>()?.Endpoint;
return endpoint?.Metadata.GetMetadata<EndpointNameMetadata>()?.EndpointName;
}

Şimdi tekrar loglarımızı inceleyelim.

Youtube:

Evet Log işlemleri için şimdilik anlatacaklarım bu kadar, umarım faydalı olmuştur. Başka bir makalede görüşmek üzere.

--

--