Docker, Spring Boot & ELK Stack İle Centralized Logging
Merhabalar, bu yazımda projelerde çok önemli olan bir konudan bahsedeceğim. O da Loglama. Evet çok basit bir konu olmasına rağmen projelerde hayati bir değere sahip. Örneğin müşteriden bir telefon gelir ve ilgili bir fonksiyonun çalışmadığından bahseder. Siz de aynı senaryoyu gerçekleştirdiğiniz zaman bir sorun ile karşılaşmazsınız. Durum daha vahim neden onda çalışmadı ve bende çalıştı? Bu tür durumları daha iyi yönetebilmek ve sorunları daha sağlıklı tespit edebilmek için şunu yaparız Loglama!!

Peki ELK Stack Nedir?
Siz bir projede veya Microservis mimarisi kurduğunuz zaman arkadaşlarlar logları teker teker log dosyalarından takip edemeyeceksiniz. Ciddi anlamda zor bir süreç yaşayacaksınız. Şimdi gelen her requesti logladığınızı düşünün bir filtreleme yapmak istiyorsunuz ölüm!!!! Ama bir arayüzünüz olsa ve orada rahatlıkla logları görseniz filtreleme yapabilseniz hatta görselleştirebilseniz nasıl olur? İşte tam bu noktada birkaç çözümden biri olak ELK Stack ortaya çıkıyor. ELK Stack Elasticsearch’in bir ürünü olduğu için oldukça iyi bir uyuma sahip.
ELK Stack Nasıl Çalışır?
Projeleriniz (spring, .net, node vb.) bir dosyaya log yazar Filebeat’e(Farklı şekilde de okuyabilir aşağıdaki örnekte Filebeat docker loglarını input olarak alıyor) bu dosya yolunu verirsiniz. Filebeat değişiklik oldukça aldığı değişiklikleri Logstash’e gönderir. Logstash veriyi alır Elasticsearch’in anlayacağı bir formata çevirir. Kibana ise Elasticsearch’ün API si ile verileri alır.

Not: Projemizde Docker kullanacağız o yüzden biraz Docker bilgisi gerekiyor.
Bu yazımızda neler yapacağız?
- Spring Boot projesi oluşturacağız ve 1 adet “/hello” endpointine bakan servis yazacağız.
- Spring Boot projesine Log4j ekleyip logları düzenli olarak bir dosyaya yazacağız (Aslında console yazsada olur ama işi adabına göre yapalım)
- Sonra Java projesini dockerize edeceğiz
- Filebeat’ı Docker loglarını okuyabilecek şekilde dockerize edeceğiz
- Logstash’i Filebeat’tan veri alabilecek şekilde dockerize edeceğiz
- Sonra tüm projemizi (Spring boot projesi, Filebeat, Logstash, Elasticsearch ve Kibana) docker ile birbirleri ile aynı networkte konuşacak şekilde ayağa kaldıracağız.
Başlayalım….
Bir adet Spring Boot projesi açıyoruz.
Projemize Log4j’yi ekliyoruz. Bunun için build.gradle dosyasına şunları eklemeniz yeterli.
Sonra bir controller oluşturup “/hello” endpointine bakan bir servis oluşturuyoruz.
En son ise “resources” klasörünün altında “log4j2.xml” adında bir dosya açıp içine bunları yapıştırıyoruz.
Projemizi ayağa kaldırıp “/hello” endpointine bir request atalım.

Bundan sonra Spring projesinin olduğu klasörde bir Dockerfile oluşturuyoruz. Dockerfile şu şekilde olacak
Dockerfile’nin bulunduğu klasörde terminali açıp şunu yazacağız;
“docker build -t logger .”
Projemiz dockerize oldu şimdi terminalde “docker images” yazınca şunu görebilmeniz gerekmekte

Şimdi Filebeat konfigürasyonunu yapalım. Bunun için 2 adet dosya oluşturacağız;
- Filebeat Dockerfile
- Filebeat konfigürasyon dosyası
Filebeat Dockerfile
Dockerfile dosyasını oluşturduğumuza göre Filebeat’ın bulunduğu klasörde Filebeat konfigürasyon dosyasını oluşturalım.
Filebeat konfigürasyon dosyası(filebeat.yml)
Şuna dikkat edelim input type olarak “docker” alıyor. Şimdi Filebeat’ı dockerize edelim. Bunun için Filebeat Dockerfile’nin içinde bulunduğu klasörde terminali açıp şunu yazalım “docker build -t hsmnzaydn/filebeat .”

Evet. Şimdi Logstash’i dockerize etmemiz lazım. Şimdi başka bir klasörde 2 adet dosya yaratacağız;
- Logstash Dockerfile
- Logstash konfigürasyon dosyası
Logstash Dockerfile
Logstash Dockerfile yukarıdaki gibi olacak şimdi bu Dockerfile’nin bulunduğu klasörde Logstash konfigürasyon dosyasını oluşturalım.
Logstash Konfigürasyon Dosyası (logstash.conf)
Bunları yaptıysak şimdi Logstash’i dockerize edelim bunun için Logstash Dockerfile’nin bulunduğu klasörde şunu yazalım “docker build -t hsmnzaydn/logstash .”

Bunu da yaptı iseniz tebrikler şuan ELK Stack’i kurmaya çok yakınsınız. Şimdi docker-compose dosyamızı oluşturalım. O da şöyle olacak;
Docker Compose (docker-compose.yml)
Şimdi ise docker-compose dosyasının bulunduğu klasörde terminali açıp şunu yazalım “docker-compose up”
Bunu yapınca 5 servis ayağa kalkacak

Biraz bekleyelim. Bekledikten sonra browsera girip şunu yazalım “localhost:5601” bu kibana default port.

Evet artık tüm projenizin docker loglarını burada görebilirsiniz bir deneme yapalım. Ben Spring Boot projeme şu objeyi göndereceğim;
{
“name”:”Hsmnzaydn”,
“surname”: “özaydın”,
“age”:25
}

Kibana’ya girip artık logu görebilirsiniz (Biraz dağınık yapmış olabilirim ama ELK Stack böyle ayağa kalkıyor)

Size son bir kıyak;
Elimden geldiğince ELK Stack’i anlatmaya çalıştım umarım ki birilerine faydası dokunur. Umarım ki bu yazıyı okayacak arkadaşlar bu satırları okurken ülkemiz bu Korona’dan kurtulmuş olur.