ELK Stack — Uygulama Loglarını Merkezilestirme ve Verileri Gorsellestirme Bolum-2: Logstash

Ibrahim Halil Koyuncu
3 min readJun 26, 2021

--

Logstash Pipeline

Merhaba, “Uygulama Loglarını Merkezileştirme ve Verileri Görselleştirme” yazı dizimin 2. kısmında Logstash ile ilgili aşağıdaki konulardan bahsedeceğim.

  • Logstash nedir ve neden ihtiyacımız var ?
  • Logstash genel konfigürasyon yapısı nasıl olmalı ?
  • Logstash üzerinde Grok pattern kullanılarak log parsing işlemi nasıl yapılır ?

gibi sorulara cevap arayacağız. Eğer logların nasıl Filebeat ile toplanılıp(log collecting) Logstash’e gönderildiğini ve Filebeat’i nasıl konfigüre edileceğine bakmak isterseniz buradan bulabilirsiniz.

Logstash Nedir ve Neden İhtiyacımız Var ?

Bildiğiniz üzere asıl amacımız uygulama loglarını , log file’larımızdan toplayarak, bir depolama birimi üzerinde ( burada ELK stack’den bahsettiğimizden Elasticsearch kullanacağız ) saklayarak uygulama loglarını analiz etmekti. Peki uygulama loglarımızı depolamadan önce, daha güçlü bir analiz için verilerimizi parse etmek istersek veya filtreleyerek farklı yerlere dağıtmak istersek nasıl bir yol izlemeliyiz ? İşte burada Logstash devreye giriyor. Filebeat üzerinden gelen uygulama logları Logstash üzerinde işlenerek, istenilen depolama birimine gönderiliyor. Output’ları Elasticsearch, MongoDB gibi depolama birimlerinden tutun; Kafka,RabbitMQ gibi kuyruk yapılarına (queue), Redis gibi cache yapılarına verileri gönderebilirsiniz. Yine aynı sistemlerden de input olarak verileri işleyip output olarak istenilen sisteme aktarabiliriz.

Logstash Konfigürasyon Yapısı

Yukarıdaki örnekte de görüldüğü üzere logstash konfigürasyonu 3 ana bölümden oluşuyor. “input” ve “output” alanları zorunlu (mandatory) iken “filter” alanı ise opsiyoneldir.

“input” alanında bulunan “beats” ve “port” alanları bulunmaktadır. “beats” bir input plugin’i olup Elastic Beats framework üzerinden gelen event’leri ilgili port’dan dinleyecektir(port listening). Yani bizim senaryomuzda; Filebeat üzerinden Logstashe erişmeye çalışırken <logstashHostIp:5044> adresi üzerinden bağlantı kuracağız. “beats” dışında da yine kafka, redis, cloudwatch gibi birçok zengin input plugin’ini desteklemektedir.

“filter” alanında ise parse, transform ve filtreleme işlemlerimizi yapabiliriz. Birazdan burada Grok patterni uygulayarak nasıl parse işlemi yapacağımızı göreceğiz.

“output” alanında ise işlenen verilerimizi nereye aktaracağımız ile ilgili bilgileri ekliyoruz. Yine senaryomuza göre yukarıdaki örnekteki gibi Logstash üzerinde işlenen loglarımızı Elasticsearch’e aktaracağımız için “elasticsearch” plugin’ini ekliyoruz. İlgili connection bilgilerinide yine burada “hosts” alanı içine çoklu(multiple) olarak ekleyebiliriz. Ayrıca logları hangi Elasticsearch index’ine göndereceğimizi de “index” alanını kullanarak belirleyebiliyoruz. Son olarak Elasticsearch credential bilgilerinide “user”, “password”, “cacert” alanlarını kullanarak ekleyebilirsiniz. Logstash output plugin’leri olarak yine zengin bir içeriğe sahiptir. İlgili plugin’leri aşağıda bulunan “Link” başlığı altından bulabilirsiniz.

Grok Pattern

Grok bize bir String mesajı Elasticsearch’te saklanacak birden çok alana ayrıştırma imkanı sağlıyor. Burada ise kullanma amacımız gelen log mesajını parse ederek ilgili alanlara setlemek olacaktır. Örnek olarak aşağıdaki Spring Boot’un default log pattern’inde yazılan log mesajını inceleyelim.

2021-07-25 03:07:11.200Z INFO 2747 - - [main] com.example.cpt.masterYoda : Loaded CptTeam in 2024 seconds (JVM running for 047.006)

Normalde herhangi bir filtre eklemeseydik Filebeat üzerinden gelen log mesajını Elasticsearch üzerinde tek bir alan olarak görürdük. Bunun yerine daha güçlü alan(field) bazlı analizler yapabilmek için log mesajımıza grok filtresi uygulayacağız.

Grok pattern’imizi oluşturmak için Grok Debugger’dan yardım alabiliriz. Grok Debugger yazdığımız pattern’i log mesajına uygun olmadığını test etmemize yarayacaktır. Grok ayrıca önceden yüklenmiş birçok pattern ile beraber gelir. Bu patternleri ve grok debugger linklerini “Links” başlığı altında bulabilirsiniz.

Şimdi grok üzerinde önceden yüklenmiş(preloaded) pattern’ler ile yukarıdaki örnek log’u nasıl ayrıştırıp parse edeceğimize bakalım.

  • Tarih alanı için “%{TIMESTAMP_ISO8601:date}”
  • Log seviyesi için “%{LOGLEVEL:logLevel}”
  • Process ID için “ %{INT:processID}”
  • Thread ismi için “%{DATA:thread}”
  • Java class adı için “%{JAVACLASS:class}”
  • Log mesajı için “%{GREEDYDATA:logMessage}”

patternlerini kullanacağız. Yukarıda tanımladığımız pattern’i grok debugger’a koyduğumuzda log mesajımızın aşağıdaki gibi ayrıştırıldığını test edelim. Burada dikkat etmemiz gereken önemli konu grok pattern’i yazarken tamamen log mesajı pattern’ine uygun şekilde yazmak. Örneğin log mesajımızda tarih ve log seviyesi arasında bir boşluk varsa grok pattern’de de arada bir boşluk bırakmamız gerekiyor.

Grok Pattern ve Output

Yukarıda da gördüğünüz üzere ilgili log mesajını Grok pattern kullanarak parse etmiş bulunuyoruz. Logstash log mesajlarını bu şekilde Elasticsearch’e gönderdiğinde ise istediğimiz alanlara göre sorgular yapabileceğiz. Örneğin logLevel alanı “ERROR” olan verileri sorgulayarak o anda uygulamamızda ki hataları anlık olarak monitör edip hızlı bir şekilde analiz çıkarabiliriz.

Grok pattern dışında da yine yapacağınız işleme göre Logstash birçok kütüphaneyi barındırmaktadır. Daha detaylı işlemler için dokümantasyonu okumanızı tavsiye ederim.

--

--

Ibrahim Halil Koyuncu
Ibrahim Halil Koyuncu

No responses yet