Containerda çalışan uygulama loglarını ne yapsak?

Fotoğraf, Markus Spiske tarafından çekilmiş, Unsplash’den indirilmiştir.

Ne yapıyoruz?

Önce bir log kütüphanesi seçiyoruz, .NET ekosisteminden bir iki örnek vermek gerekirse NLog, SeriLog, Log4Net, vb. Bu kütüphaneler için gerekli konfigürasyonları tanımlıyoruz, target olarak ifade edilen ve log’un nereye/nasıl yazılacağını belirttiğimiz şablonlar oluşturuyoruz. Sonrasında ise uygulamada log için gerekli olan akışı kodluyor ve gerek gördüğümüz yerlerde log sınıfı üzerinden bu akışı canlandırıyoruz.

Yani…

Logları Elasticsearch üzerinden tutmaya karar veriyoruz. Yanına bir Logstash kuruyoruz. NLog’a Network tipinde bir target tanımlıyoruz, bağlantı cümleciği olarak tcp:// ile başlayan ve Logstash’a referans eden bir url giriyoruz. Bu target’a da layout olarak bir JsonLayout tanımı giriyoruz (log içerisinde hangi alanlar yer alacak, bu alanların varsayılan değerleri nelerdir, hangi alanlar uygulama tarafında doldurulacak, vs…). Son olarak uygulamanın içerisinden _logger.LogInformation("Buraya log mesajı gelecek!") diyerek log atma eylemimizi tamamlıyoruz. Aşağıda örnek bir NLog konfigurasyonu görüyoruz:

Gibi görünüyor, çünkü…

12Factor kavramı ile karşılaştıysanız muhtemelen siz de cloud-native uygulamalar geliştiriyorsunuz. Bu kavram altında bahsedilen 12 teori, bir uygulamanın cloud-native olarak tasarlanması için gerekliliklerden bahsediyor. Bu teorilerden biri de Logs.

  1. Uygulamanızı en alt seviyede başka bir uygulamaya (log sistemine) bağımlı tutmak ne kadar sağlıklı?
  2. Günün birinde ilgili logları X noktasından Y noktasına geçirmek istediğinizde uygulamanızı değiştirmek zorunda mısınız?
  3. Log sistemine erişemediğiniz için uygulamanızın cevap verememesi (mimari bir hatadır, kabul edilemez) normal mi?
  4. Log’un akmadığını düşündüğünüz bir noktada konsantrasyonu nereye yönlendirirsiniz (uygulama mı logu iletemiyor, log sistemi mi uygulama loglarını alamıyor)?

Ne yapabiliriz?

12 faktörün de yönlendirdiği gibi, oldukça basit bir yordam: Log’u ekrana çıktı olarak iletin (stdout)!

Sonrası…

Tecrübe sahibi olduğunuz ve “log collect” eden ürünleri kurmak ve ekrana çıktı olarak basılan logları okuyup, yorumlayıp bir merkeze kaydedilmesini sağlamak. Örneğin;

Elastic’in FileBeat adlı ürünü, container loglarını yakalayabilme kapasitesine sahip bir ürün. Ayrıca yakaladığı logları diğer Elastic ürünlerine de direkt olarak iletebiliyor (Logstash’ iletmek ya da direkt olarak Elasticsearch’e yazmak gibi). Kibana ile de bu logları görselleştirebiliyorsanız, container olarak koşan her uygulama için ayrı bir log yapısı kurmaya gerek kalmadan bütün bu operasyonu tek bir merkezden yönetebilirsiniz.

Yukarıdaki örneği canlı canlı denemek isterseniz aşağıdaki Github reposundan kaynağı indirebilirsiniz:

Sonuç

Örnekte yer alan Elasticsearch, Kibana, FileBeat ürünlerine ait konfigürasyonların “Production” ortamı için uygun olmadığını belirtmem gerek. Bir iki ufak ayar gerekli, ama genel davranış bu şekilde olacaktır. Ayrıca 12factor.net adresindeki diğer yaklaşımları da inceleyip, içselleştirmekte fayda var diye düşünüyorum. Bir sonraki yazıya dek, loglarınızın kara deliğe uğramaması dileğiyle :)

--

--

Engineering Manager (at) Hepsiburada. Former trainer & consultant. Tweets are mostly about tech and coding. https://superpeer.com/selcukusta

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Selçuk Usta

Selçuk Usta

Engineering Manager (at) Hepsiburada. Former trainer & consultant. Tweets are mostly about tech and coding. https://superpeer.com/selcukusta