Asp.Net Core 3 & Elastic Search - Log Everything

Hasan Şahin
HardwareAndro
Published in
4 min readNov 15, 2020

Selamlar herkese, bu yazımda Elastic Search nedir, .Net projelerimizde nasıl kullanabileceğimiz hakkında bir yazı hazırladım. İyi okumalar dilerim.

Elastic Search, Index’ler üzerinden hızlı bir şekilde okuma ve kayıt işlemleri yapabildiğimiz dağıtık mimariye sahip, açık kaynak kodlu bir servistir. Elastic Search ile birlikte yüksek boyutlu datalarımız kaydederken kullandığımız modele göre filtreleme yapabilir, hatta mesafe ölçümü gibi çeşitli hesaplama işlemlerini yaptırabiliriz.

Servislerin kurulumu ile ilgili birçok kaynak mevcut. Arayüz için ise kibana kullanabilirsiniz.

1. Elastic ve .Net Kullanım Alanları

Örnek yapacağımız uygulama ile projemizde nelere yapabileceğimizi kısaca anlatmak gerekirse;

  • Özel bir Index oluşturarak istediğiniz Class’ı loglayabilirsiniz
  • Database üzerinde Update,Delete gibi güncellemeler yapan kullanıcıların, hangi Class ve Id ile işlem yaptığını, değiştirdiği verilerin ilk ve son halini loglayabilirsiniz.
  • Belirlediğiniz Controller veya Action’lara istek atan kullanıcıların IP adreslerini, istek attığı Route, gönderdiği parametreleri, ve User Id’sini loglayabilirsiniz.
  • Uygulamanızın Exception almasına sebep olan hatanın mesajını, Route bilgisini ve bu durumla karşılaşan User giriş yapmış ise kullanıcı bilgisini loglayabilirsiniz.

2. Elastic Search Library Kurulumu

Library üzerinde işlem yapmak isteyen kişiler için projeyi Github adresinden indirip kendi projelerine dahil edebilirler. Kurulum yaparak kullanmak isteyen kişiler için ise Nuget paketi üzerinden kullanım sağlayabilirler.

Install-Package ElasticSearchLibrary

Kurmuş olduğumuz paketin kullandığı servisleri entegre etmemiz için ‘Startup.cs’ dosyamıza gerekli tanımlamaları yapıyoruz.

public void ConfigureServices(IServiceCollection services)
{
services.AddElasticServices();
}

Elastic Search servisine bağlantı sağlayabilmemiz için Bağlantı bilgilerimizi appsettings.json’ dosyamıza ekliyoruz.

"ElasticConnectionSettings": {
"ConnectionString": {
"HostUrls": "http://localhost:9200/",
"UserName": "",
"Password": ""
}
}

Böylelikle Kütüphane kullanımı için gerekli ayarlamaları yapmış olduk. Şimdi saydığımız özellikleri projemize nasıl uygulayabileceğimizi görelim.

2.1 Controller/Action İsteklerin Loglanması

Burada loglamamız için Controller’ımızın üstüne [ActivityFilter] ile Filter tanımlamamız eklememiz yeterli olacaktır.

Göndereceğimiz ‘LogAllEndpoints’ parametresini TRUE olarak tanımlarsak, Controller altında bulunan bütün Action’lar loglanmış olur. Eğer belirli Action’ların loglanmasını kaldırmak istersek [NoLogEndpoint] Attribute tanımlamasını Action üstüne ekleyerek loglanmasını kapatabiliriz. ‘LogAllEndpoints’ parametresini FALSE tanımlarsak eğer, loglamak istediğimiz Action’ların üstüne[LogEndpoint] eklememiz gerekir.

Activity Log

2.2 Database Modellerinin Loglanması

Database üzerinde yapılan işlemleri loglamak için Context Class’ınız içerisinde Entitiy Framework’ün override SaveChanges özelliğini kullanıyoruz.

Öncelikli olarak Dependency tanımlamamızı constructor ile gerçekleştiriyoruz.

private IDatabaseLogger dbLogger;
public ProductContext(DbContextOptions options, IDatabaseLogger _dbLogger) : base(options)
{
this.dbLogger = _dbLogger;
}

Şimdi SaveChanges metodunu kullanarak loglama için gerekli tanımlamayı yapmış oluyoruz.

public override int SaveChanges() 
{
dbLogger.LogChanges(ChangeTracker);
return base.SaveChanges();
}

Loglama tanımlamalarını yaptıktan sonra sıra hangi modellerimizin loglanacağını seçmemize geldi. Bunun için [LogModel] Attribute tanımlamasını Class’ımızın üstüne ekliyoruz.

[LogModel]  // ->  Logs All Props
public class Product :IElasticModel
{
[DisplayName("Record Id")] //Değişken adını farklı göstermek için
public int ID { get; set; }
[LogProp] // -> Log Specific Props (Remove LogModel Attribute)
public string Name { get; set; }
[DisplayName("Seri No")]
[LogProp]
public string SeriNo { get; set; }
}

[LogModel] : Modelin loglanma özelliğini aktif hale getirir.

[LogProp] : Loglanmasını istediğimiz propertyleri seçmemizi sağlar.

IElasticModel : İsteğe bağlı interface tanımlaması.

[DisplayName()] : Loglanan property isimlerini değişmek isterseniz kullanabilirsiniz.

Böylelikle Database üzerinde yapılan bütün değişiklikler işlemi yapan kullanıcı ile birlikte loglanabilir hale gelmiştir.

Not: Eğer property değeri değişmemiş ise loglamaya dahil edilmez.

DB Change Log

2.3 Exception’ların Loglanması

Uygulamamızın hata vermesine sebep olan durumları yakalamak için ise tek yapmamız gereken Startup.cs dosyasına Configure eklemektir.

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.AddElasticErrorHandler();
}
Error Log

3. Elastic Search Servis Yönetimi

Yaptığımız Loglama işlemlerini ve Index yönetimini sağlamamız için Library içerisinde hazır bir Controller tanımlıdır. Bunu kullanmak için oluşturduğumuz bir Controller’a miras aldırarak kullanımını sağlayabiliriz.

public class ElasticController : ElasticSearchController
{
public ElasticController(IElasticSearchManager _elasticSearchService) : base(_elasticSearchService) { }
}

Bu tanımlama sayesinde ‘ElasticController’ kendi projenizde tanımlı bir Controller olduğu için istediğiniz gibi yönetimini sağlayabilirsiniz.

Projenizde Swagger kullanıyorsanız ‘ElasticSearchController’ altında bulunan bütün fonksiyonları görebilirsiniz.

Elastic Controller

Burada bulunan endpointleri kısaca anlatmak gerekirse;

  • Search işlemleri loglanan kayıtları filtreleyerek erişmenizi sağlar.
  • Clear işlemleri Index’ler içinde bulunan kayıtları temizlemenizi sağlar.
  • InsertLogForModel’ Action’u belirlediğiniz Index’e model loglamanızı sağlar. Burada örnek olarak ErrorLog Class’ı kullanılmıştır.
  • ‘CreateIndex’ Action’u ile Alias’a bağlı yeni bir Index oluşturabiliriz.
  • ‘CreateIndexAndAlias’ Action’u ise sadece Index adı alarak o isimde Indexve alias oluşturur. Eğer yeni bir model loglamak isterseniz bu Action ile birlikte bir Index oluşturabilir ve Servis fonksiyonları ile kayıt girebilirsiniz.

Umarım açık bir şekilde aklımdakileri aktarabilmişimdir. Okuduğunuz için teşekkür ederim.

https://github.com/hasansahinnn/.NetCore_ElasticSearchv7_LogEverything

--

--