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.
1 2 3 | bin/logstash -e 'input { stdin { } } output { elasticsearch { host => localhost } }' curl 'http://localhost:9200/_search?pretty' |
- 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.
- 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.
- 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.
- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | input { udp { port => 4560 codec => json { charset => "UTF-8" } } } output { stdout { } elasticsearch { host => localhost } } |
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
1 2 3 4 5 | <dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.2</version> </dependency> |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="UTF-8"?> <configuration> ... <property name="LOGSTASH_HOST" value="${logstash.host:-192.168.1.10}" /> <property name="LOGSTASH_PORT" value="${logstash.port:-4560}" /> <property name="LOGSTASH_CONNECTION_DELAY" value="${logstash.connectionDelay:-30000}" /> <property name="LOGSTASH_ENV" value="${logstash.environment:-TEST}" /> <property name="LOGSTASH_APP_NAME" value="${logstash.appname:-myDemoApp}" /> ... <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashSocketAppender"> <host>${LOGSTASH_HOST}</host> <port>${LOGSTASH_PORT}</port> <reconnectionDelay>${LOGSTASH_CONNECTION_DELAY}</reconnectionDelay> <customFields>{"appname":"${LOGSTASH_APP_NAME}","environment":"${LOGSTASH_ENV}"}</customFields> </appender> <root level="DEBUG"> ... <appender-ref ref="LOGSTASH" /> ... </root> ... </configuration> |
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