Logstash ve Logback

Son yıllarda uygulama geliştirme şekli, bir çok işi yapan büyük uygulamalardan, tek bir işi yapan küçük uygulamalara doğru kaymakta. Bu yeni yapı eskisinde bulunan bir çok sorunu çözüyor fakat beraberinde de yeni sorunlar getiriyor. Benim gördüğüm bu sorunlardan biri ise, tüm bu küçük uygulamaların merkezi bir şekilde yönetilmesi ve görüntülenmesi. İşte tam bu sorunu çözmek adına log toplama platformları geliştiriliyor. Splunk, GrayLogs, LogStash, Loggly, SumoLogic bunlardan bir kaçı. Ben ise bu yazıda LogStash üzerinde duracağım ve Logback kullanarak Logstash üzerine nasıl loglama yapabileceğinizi anlatmaya çalışacağım.

ElasticSearch, LogStash ve Kibana – ELK

LogStash denildiğinde ve internette logstash’i arattığınızda, karışınıza hızlı aramalar yapabildiğiniz, detaylı grafikler alabildiğiniz, güzel ve hızlı ekranlar geliyor. Ama bunalr aslında sadece Logstash değil. O tüm güzel ekranların bulunduğu yapı üç farklı uygulamanın birleşiminden oluşuyor. Bu yapıyı ElasticSearch, LogStash ve Kibana (kısaca ELK) birlikte oluşturuyor. Eğer o tüm ekranları bir arada istiyorsanız bu stack’i kurmanız gerekiyor.

Ben bu stackin nasıl kurulduğunun detayına girmeyeceğim. İnternette bununla ilgili güzel tutoriallar var zaten. Ben kurulumumu yaparken aşağıdaki adresten yararlandım.

Eğer zaten bu stack sizde kuruluysa yapanız gereken birşey yok. Doğrudan Logback ve LogStash’in nasıl konuşturulduğu kısmından başlayabilirsiniz. Ama bu  tutorial’ı takip edip bir kurulum yapacaksanız, bir iki tavsiyem olacak.

  • Tutorial sistem loglarının LogStash üzerinde loglanmasına yönelik. Eğer böyle bir amacınız yoksa, Nginx kurulumunu, SSL kurulumunu, LogstashForwarder kurulumunu ve LogBack ayarlarını atlayabilirsiniz.
  • Tutorial komple bitmeden ne yazık ki yaptıkalrınızı test edemiyorsunuz. Yani gönderiğiniz log, Logstash’e mi ulaşmıyor, yoksa Elasticsearch’temi hata var ya da Kibana’da mı sorun var anlayamıyorsunuz. Bu sebepten ben adım adım test etmekten yanayım. Adım adım test etmek isterseniz Logstash stesindeki GettingStarted makalesine bakın derim. Burada özellikle LogStash ve ElasticSearch arasındaki bağlantıyı aşağıdaki iki komut ile test edebileceğinizi unutmayın.

  • Logstash kurulumunda sadece benim aşağıda anlatacağım kısmı ayarlarınıza eklemeniz yeterli olacaktır. SSL falan tanımlamadığınızda diğer ayar dosyaları (özellikle lumberjack) hata verecektir. En temizi hiç eklememek.

Bu stack’teki akıştan da biraz bahsedeyim. Logback’te Kibana’da doğrudan elasticsearch ile konuşuyor. Kibana’ya sadece hangi indexleri okuyacağını söylüyoruz.

Logstash Ayarları ve Encoder

Şimdi ayarların neler olduğuna ve hangi kütüphaneyi kullanarak bağlanacağımıza bakalım. Java projemizde logstash-logback-encoder kütüphanesini kullanacağız. Bu kütüphane bize üç temel şekilde logstash aktarımı yapmamıza olanak sağlıyor.

  1. Log Dosyası Üzerinden: Logstash ile aynı bilgisayar da çalışıyorsanız ya da Loglama yapacağınız dizin Logstash’in çalıştığı makineden erişilebiliyorsa kullanabileceğiniz bir alternatif. Bu şekilde yapacağınız bir tanımlamada, sadece kullandığınız file appender’ın encoder’ını Logstash encoder yapıyorsunuz. Yeni bir appender eklemenize gerek kalmıyor. Ama logstash tarafında ayarlarınızı yaparken nasıl parse edeceğinizi Grok kullanarak belirtmeniz gerekiyor. Bence hiç effektif bir yol değil ama internette anlatılan hemen hemen tüm tutoriallar bu şekilde. Düşünün canlı ortama kurulum yapacaksınız, dosyaya erişebilecek misiniz erişemeyecek misiniz belli değil, appender’ınızın patterninde bir yeri değiştirdiğinizde Grok tarafında da pattern değişitirmeniz gerekecek.
  2. TCP Üzerinden: Log dosyası kullanmaktan daha iyi bir alternatif. Logback tarafında yeni bir appender tanımlanız lazım. Logstash tarafında ise hangi tcp üzerinden geldiğinizi belirlemeniz gerekiyor. Buradaki tek sorun TCP.
  3. UDP Üzerinden: Bence en effectif yol. Yeni bir appender tanımlıyorsunuz. Logstash tarafında UDP portunu belirliyorsunuz. Uygulamanız mesajı gönderiyor. Tanımlamanız ve bilmeniz gereken şeyler minimumda. Daha sonra özel patternler belirleyeceğim, Grok ile parse edeceğim derseniz onu da yapabilirsiniz. Üstelik UDP’den gelenleri sadece Elasticsearch’e yönlendirmek durumunda da değilsiniz. Hem elasticsearch’e hem dosyaya da yönlendirebilirsiniz, tabi isterseniz.

Bana daha effectif geldiğinden UDP portu üzerinden nasıl yapılabileceğini anlatacağım.

Logstash Ayarları

ELK kurulumunu başarıyla yaptıysanız, logstash’in kurulu olduğu makinede, /etc/logstash/conf.d/ klasörüne, logback-2-logstash.conf isminde yeni bir ayar dosyası oluşturalım. İçeriği ise aşağıdaki gibi olacak.

logback-2-logstash.conf

Burada yaptığımız ayarlara biraz değinecek olursak:

  • Burada temel olarka logstash’in nerelerden girdi alacağını ve nerelere çıktı vereceğini belirlemiş olduk.
  • Burada logstash’in farklı farklı modüllerinden yararlanabilirsiniz tüm listeyi bu linkten öğrenebilirsiniz.
  • Girdi olarak, 4560 UDP portundan, json codec‘ine uygun ve UTF-8 encoding’inde veri bekliyor.
  • Json Codec’inin nasıl bir formatta olduğuyla siz ilgilenmiyorsunuz. Bunu bizim için kullanacağımız logstash-logback-encoder kütüphanesi halledecek.
  • İki adet çıktı üretiyor. Biri stdout yani yeni log dosyasına diğeri ise elasticsearch’e. Stdout çıktısını takip edebilmek için bırakıyorum. Canlı ortamda size ayak bağı olacağından kaldırmanız yerinde olacaktır.

Java ve Logback

Logstash tarafını hallettiğimize göre şimdi Java tarafına geçebiliriz. Burada sırf loglamanın nasıl yapılacağını göstermek için sıfırdan bir proje yapmayacağım. Projenizin logback kullanarak loglama yapabildiğini ve log ayarlarınızı logback.xml dosyası üzerinden yaptığını varsayacağım.

Maven

İlk önce bağımlılıklarımızı güncelleyelim. Bunun için pom.xml doyamıza aşağıdaki bağımlılığı ekleyelim.

pom.xml

Logback

Bağımlılığımızı güncellediğimize göre sıra logback.xml dosyamızı güncellemeye ve yeni appender’ımızı eklemeye geldi. Ben appender’ı doğrudan root’a bağlayacağım. Buradan sonra appender’ınızı nasıl özelleştireceğinizi size bırakıyorum.

logback.xml

Burada değinmek istediğim bir kaç konu ise aşağıdaki gibi

  • Burada logstash adresi parametrik yapılmış ve varsayılan değer verilmiştir. Logback’te varsayılan değer “:-” operandı ile belirtiliyor.
  • Eğer isteseniz her log için bazı sabit alanlarda gönderebiliyorsunuz. Bu örnekte uygulama adı ve ortamı gibi bilgiler gönderdim. Ama gerçek dünya da ne kadar kullanışlı olur bilmiyor.
  • Tüm parametreleri -D ile runtime’da değiştirebilirsiniz. Örneğin: -Dlogstash.host=192.168.1.11 gibi…

Son

Elimden geldiğince Logstash ve Logback entegrasyonu için gerekli olan tüm bilgileri vermeye çalıştım. Umarım yeterli olmuştur.

End of Line

  • Mesut Özen

    Sadece logstash kullanmamız yeterli olmuyor mu ? Ben pek güzel ekranlar istemiyorum 🙂

    • bhdrkn

      Logları toplamak için logstash yeterli. Ama logları toladıktan sonra neden görüntülemek istemeyesin onu anlamadım. 🙂
      Eğer elastiksearch ve kibana olmadan, ben logları logstash ile toplayayım tek bir dosyaya yazayım diyorsan, http://logstash.net/docs/1.1.0/outputs/file ile yapabilirsin bunu.

      Denemedim ama bunu aşağıdaki ayarlarla yapabileceğini düşünüyorum.

      input {
      udp {
      port => 4560
      codec => json {
      charset => “UTF-8”
      }
      }
      }

      output {
      stdout { }
      file {
      path => “/var/logstash/test.log”
      }
      }

      • Mesut Özen

        Anladım teşekkürler Bahadır Bey:)