Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.NET’te Serilog İle Amazon CloudWatch’ta Logging İşlemleri

Merhaba,

Bu içeriğimizde Amazon CloudWatch servisi üzerine odaklanacak ve .NET’te Serilog ile Amazon CloudWatch’a logging işlemlerini ele alıyor olacağız. Her şeyden önce loglama süreçlerinde kullandığımız güçlü bir kütüphane olan Serilog ve görselleştirme aracı olan Seq ile ilgili daha önceden klavyeye almış olduğu Asp.NET Core – Serilog İle Veri Loglama ve Seq İle Görselleştirme başlıklı makaleme göz atabilir, ardından bu makaleye devam edebilirsiniz. Bizler ise bu konulara vakıf olanlarla yol alıp, bu içeriğin taşlarını döşemeye başlayalım…

Amazon CloudWatch Nedir?

Amazon CloudWatch, Amazon Web Services(AWS) tarafından üretilen bir izleme(monitoring) ve yönetim hizmetidir. CloudWatch; AWS servislerinin ve bu servislerde çalışan uygulamalarınızın canlı süreçlerde nasıl tepki verdiklerini izlemek için kullanılmakta ve böylece uygulamanıza dair altyapı sonuçlarını, performans durumlarını ve güvenilirliği değerlendirebilmenizi sağlamaktadır. Ayrıca CloudWatch ile çeşitli AWS kaynaklarını da izleyebilir ve bu kaynaklardan istediğiniz metrikleri ve logları kendi uygulama çerçevelerinizde kullanabilirsiniz.

CloudWatch’ın temel işlevi; ölçümler ve metriklerle ilgili veriler toplamak ve bu verileri bir arayüzde yahut API aracılığıyla kullanılabilir hale getirmektir. Topladığı metrikler; CPU kullanımı, ağ bölümleri, depolama alanı kullanımı vs. gibi performans görüntüsü temsil eden değerlerdir diyebiliriz. Bunların yanında sıklıkla kullandığımız uygulamaya dair hataları, uyarıları ve logları da toplamakta ve bu verileri kullanılabilir veya izlenebilir hale getirmektedir.

Tüm bunların dışında, CloudWatch ile belli olaylara karşılık tepki olarak otomatik işlemleri gerçekleştirebilir, filanca bir metriğin belirlenmiş bir adil sınırı aşımı durumunda otomatik olarak kısıtlamalar başlatabilir veya hata durumlarında bildirimler gönderebilirsiniz.

.NET’te Serilog İle Amazon CloudWatch’ta Logging

.NET’te Serilog ile Amazon CloudWatch’ta loggin işlemini ele alabilmek için basit bir uygulama üzerinden pratik yapmamız gayet yeterli olacaktır kanaatindeyim. Şimdi bunun için bir Asp.NET Core API projesi oluşturunuz ve ilgili projeye aşağıdaki kütüphaneleri yükleyiniz.

Kütüphane Açıklama
AWS.Logger.SeriLog Bu kütüphane, .NET uygulamalarında Serilog kullanarak AWS CloudWatch’a loglama işlemi için kullanılan ve AWS tarafından resmi olarak tanıtılan bir kütüphanedir.
Serilog.AspNetCore Bu kütüphane, Asp.NET Core uygulamaları için loglama süreçlerinde Serilog’u kullanmayı sağlar.
Serilog.Settings.Configuration Bu kütüphane, Serilog’un loglama yapılandırmalarını okumak için kullanılmaktadır.
Serilog.Sinks.Console Bu kütüphane ise Serilog’un topladığı bilgileri console’a yazdırmak için kullanılmaktadır.

Kütüphaneleri yükledikten sonra uygulamanın ‘Program.cs’ dosyasında aşağıdaki gibi Serilog için temel yapılandırmayı gerçekleştirelim.

builder.Host.UseSerilog((_, logger) => logger.WriteTo.Console().ReadFrom.Configuration(builder.Configuration));

Ardından bu yapılandırmayı besleyebilmek için ‘appsettings.json’ dosyasına da aşağıdaki konfigürasyonel değerleri ekleyelim:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft": "Warning"
    }
  },
  "AllowedHosts": "*",
  "Serilog": {
    "LogGroup": "/logs/example",
    "Region": "ap-south-1",
    "MinimumLevel": {
      "Default": "Debug",
      "Override": {
        "Microsoft": "Error",
        "System": "Error",
        "Microsoft.Hosting.Lifetime": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "AWSSeriLog",
        "Args": {
          "textFormatter": "Serilog.Formatting.Json.JsonFormatter, Serilog"
        }
      }
    ]
  }
}

Yukarıdaki konfigürasyonel çalışmaya göz atarsanız eğer; 11. satırdaki ‘LogGroup’, her uygulama veya kullanım durumu için CloudWatch’da ayrı bir log bloğuna karşılık gelen ayırıcı özelliği ifade etmekte ve bu uygulamaya özel de ‘/logs/example’ değerinde grup adı konfigüre edilmektedir. Bunun haricinde opsiyonel olan 12. satırdaki ‘Region’ tanımının dışındakiler klasik Serilog konfigürasyonuyla alakalı yapılandırmalardır.

Esasında yapılması gereken tüm işlemler bundan ibarettir. Bundan sonra kurulumu test edebilmek için basit bir controller oluşturalım ve içerisinde bir kaç loglamayla ilgili çalışma yapalım.

    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        private readonly ILogger<ValuesController> _logger;

        public ValuesController(ILogger<ValuesController> logger)
            => _logger = logger;

        [HttpGet]
        public IActionResult Get()
        {
            _logger.LogDebug("Debug Log");
            _logger.LogInformation("Information Log");
            _logger.LogError("Error Log");
            return Ok();
        }
    }

Yapılan bu çalışma neticesinde ilgili controller’a istek gönderdiğimizde Amazon CloudWatch’ta aşağıdaki görseldeki gibi yapılandırmaya uygun Log Group oluşturulacak ve gerekli loglama gerçekleştirilmiş olunacaktır..NET'te Serilog İle Amazon CloudWatch'ta Logging İşlemleri.NET'te Serilog İle Amazon CloudWatch'ta Logging İşlemleri.NET'te Serilog İle Amazon CloudWatch'ta Logging İşlemleriAyrıca Amazon CloudWatch’a kaydedilecek logların hata düzeyini de belirlemek istiyorsanız aşağıdaki gibi restrictedToMinimumLevel üzerinden bir konfigürasyon gerçekleştirebilirsiniz.

  .
  .
  .
    "WriteTo": [
      {
        "Name": "AWSSeriLog",
        "Args": {
          "textFormatter": "Serilog.Formatting.Json.JsonFormatter, Serilog",
          "restrictedToMinimumLevel": "Error"
        }
      }
    ]

Yukarıdaki gibi bir yapılandırma neticesinde uygulama sadece hata(error) olan logları CloudWatch’a gönderecek, diğerlerini eleyecektir.

Son olarak; geliştirdiğimiz uygulamanın herhangi bir noktasında AWS’ye dair bir kimlik doğrulama gerçekleştirilmediği halde, nasıl oluyor da AWS CloudWatch’a loglar gönderiliyor diye sorarsanız eğer bunun AWS SDK’sı ile gerçekleştirildiğini bilmenizde fayda vardır. Asp.NET Core uygulamalarında, Serilog ile yazdırılan log’ların AWS CloudWatch’a gönderilmesini sağlamak için, AWS SDK’sı kullanılmakta ve böylece ekstradan bir yapılandırmaya gerek duyulmamaktadır.

Yapılandırma dosyasındaki ‘AWSSeriLog’ bölümü, Serilog tarafından gelen log’ların AWS CloudWatch’a gönderilmesi gerektiğini ifade etmekte ve bunun için uygulamanın çalıştığı ortamdaki AWS IAM(Identity Access Management)’den kimlik doğrulama için gerekli bilgiler edinilerek, AWS SDK’i tarafından kullanılmaktadır. Yani uzun lafın kısası, uygulama Serilog yapılandırmasında AWS CloudWatch hedefi için, AWS SDK’si sayesinde otomatik olarak IAM kimlik bilgilerini kullanarak logları Amazon CloudWatch’a göndermektedir.

Haliyle uygulamayı ilk etapta localhost üzerinde test ettiğimiz için ee doğal olarak local’de ki AWS IAM profil bilgilerinin doğru olduğundan emin olmanız gerekmektedir.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek projeye aşağıdaki github adresinden erişebilirsiniz.
https://github.com/gncyyldz/AWS.CloudWatch.Serilog.Example

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. orhan ekren dedi ki:

    İyi bayramlar diler, teşekkür ederiz.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir