DevOps

Merkezi Log Yönetimini Nasıl Yapıyoruz?

Vellkam uygulamasının backend tarafınını Spring boot ile implemente ettik. Loglar logback çatısı ile log dosyalarını yazılıyor. Gelen kullanıcı yükünü kaldırabilmek için loadbalancer sunucularımız arkasında birden fazla Spring boot uygulama sunucusu kullanıyoruz. Durum böyle iken uygulamanın oluşturduğu log dosyaları da değişik sunucular üzerinde yer alıyor.

Log dosyalarının dağıtık (distributed) olmasının getirdiği bir dejavantaj var. Uygulama bünyesinde bir hata oluşması durumunda, hatanın oluştuğu uygulama sunucusunu lokalize ederek, hatayı bu sunucunun oluşturduğu log dosyalarında aramak gerekiyor. Bu iki uygulama sunucusun kullanıldığı altyapılarda bile büyük bir sorun teşkil ederken, onlarca ya da yüzlerce uygulama sunucularından oluşan altyapılarda hata aramak ve bulmak hemen hemen imkansız hale gelebilmektedir. Bu sorunu çözmek için logların merkezi bir yerde toplanmaları gerekmektedir. Bu yazımda merkezi log yönetiminin nasıl yaptığımızı anlatmak istiyorum.

Merkezi log yönetimi için logların toplanabileceği bir merkezin tayin edilmesi gerekmektedir. Bu amaçla örneğin Elastic Search, Graylog, Spluk, Grafana Loki gibi uygulamalar kullanılabilir. Biz Graylog kullanıyoruz. Bunun yanı sıra oluşan logların kaynaktan bu log merkezine aktarılması gerekmektedir. Bunun için Logstash, FluentD, Filebeat gibi uygulamalar mevcut. Bu tür uygulamalar log dosyalarına yazılan yeni satırları http, tcp ya da udp ile merkeze aktarırlar.

Biz özellikle oluşan java stacktrace loglarını sorunsuz ve daha efektif bir şekilde merkeze aktarabilmek için logback-gelf çatısını kullanıyoruz. Bu şekilde oluşan log satırlarını aracı bir uygulama olmadan, doğrudan uygulama icinden merkeze aktarmak mümkün.

logback-gelf çatısında GelfTcpAppender isminde bir appender mevcut. Gelf graylog extended log format anlamına gelen bir nevi protokol. Logback konfigürasyonumuz şu şekilde:

// logback-gelf dependency
implementation group: 'de.siegmar', name: 'logback-gelf', version: '6.1.1'

// logback-spring.xml
 <appender name="GELF" class="de.siegmar.logbackgelf.GelfTcpAppender">
    <graylogHost>merkezi.sunucu.com</graylogHost>
    <graylogPort>port12345</graylogPort>
 </appender>

 <appender name="ASYNC GELF" class="ch.qos.logback.classic.AsyncAppender">
   <appender-ref ref="GELF"/>
   <neverBlock>true</neverBlock>
 </appender>

Bu şekilde her sunucu logların nereye göndermesi gerektiği bilgisine sahip. Logların Graylog tarafından karşılanabilmesi için bir Gelf Tcp portun açılması gerekiyor. Bu işlemi Graylog inputs sayfasından yapmak mümkün. Port açıldık sonra tüm loglar Graylog bünyesinde erişilebilir hale gelmektedir.

Şimdi bir hata olduğunda, bu hataya ait loglara doğrudan nasıl erişebileceğimize bir göz atalım. Bir hata oluştuğunda, bu hataya ait log satırlarına doğrudan oluşmamızı sağlayacak bir ibareye ihtiyacımız var. Bunun için traceId olarak isimlendirdiğimiz anahtarları kullanıyoruz. Sunuculara gelen her istek ve o isteğin oluşturduğu tüm loglara traceId işleniyor. Bunun nasıl yapıldığını bu yazımda aktarmıştım.

Peki bu traceId ye nasıl ulaşıyoruz? Uygulama sunucularından gelen her cevap (response) traceId yi şu şekilde ihtiva ediyor:

x-trace-id: [67a5bac40d514322d0034b44ae81bf8b]

Bu traceId yardımı ile Graylog bünyesinde log araması yapmak mümkün. Arama esnasında sadece bu traceId ile bezenmiş log satırları bulunacağı için kullanıcı isteğini kapsayan tüm loglar ve dolaylı olarak tüm hatalara erişim sağlanmaktadır.

EOF (End Of Fun)
Özcan Acar

Bir yanıt yazın

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