ELK Stack Kurulumu ve Docker ile Loglama Sunucusu kurulumu

Merhaba Arkadaşlar 🙂

Bu yazımla karşınızdayım çünkü gerçekten DevOps açısından önemli ve şirket içerisinde belki işlerinizi aşırı derecede kolaylaştıracak bir yazılım grubundan bahsedeceğim. Bu günkü konumuz ELK Stack olacak. Peki nedir bu ELK Stack ? Öncelikle bunu bir açıklığa kavuşturalım.

Elastic Search, Logstash, Kibana

1462437187elk-logo

adlı üç adet uygulamadan oluşan ve asıl amacı loglamayı ileri derecede kolaylaştıran ve bir çok girdi ve çıktıya destek verebilen bütünsel bir programsal yapıdır diyebiliriz. Yazıyı ve uygulamayı yaparken işimizi kolaylaştırmak adına Docker üzerinden gitmeye çalışacağım. Çünkü Docker ile kurulum sıkıntıları ve bağımlılık problemi kesilmiş oluyor ve siz sadece işinize odaklanıyorsunuz ve istediğinizde anında başka bir yere taşıyabiliyorsunuz.  Evet, yukarıda bahsettiğim gibi ELK stack bir loglama aracı topluluğu gibi düşünebiliriz. Hepsini teker teker açıklamaya çalışalım. Kısaca bu araçlar nelerdir açıklamaya çalışayım:

Elastic Search:  Java ile yazılmış ve full text search ve analize izin veren bir nosql veritabanıdır.

Logstash: Uygulamanız ve Elastic Search arasında adeta bir köprü görevi gören bir yazılımdır. Konfigürasyon dosyası 3’e ayrılır. Input, Filter ve Output.

Kibana: Elastic Search’e kaydedilen logları anlık olarak izlemenizi sağlayan ve istendiği takdirde grafiksel istatistiler bile çıkarabilecek ciddi anlamda yetenekli bir web uygulaması.

 

Şimdi isterseniz senaryoya geçeyim: Öncelikle bir mobil uygulamamızın olduğunu ve bunun üzeridnen logların bir dosya halinde sunucuya yüklendiğini ve bunun ardından önceden belirlenen bir dosyaya bu yeni yollanan logların append edildiğini düşünelim. Bu log topluluğu da bizim ELK Stack’e yazılacak ve kullanıcı bunları kibana üzerinden takip edecek ve bütün hata ve logları anlık olarak takip edecek. Kulağa çok hoş geliyor değil mi 🙂 Evet bunları yapmak çokta zor değil aslında.

Öncelikle şöyle bir durum var, değiştirilen log dosyasının sunucu içerisinde her defasında okunması için FileBeat‘e ihtiyacımız var. Ne işe yarar diye soracak olursanız FileBeat ile değiştirilen dosyalar satır satır okunabiliyor ve logstash’in input’una yönlendiriliyor. Logstash böylelikle filtreden geçirip bu logları output’una yönlendirebiliyor. Output burada ne olabilir diye aklınızada soru işareti oluşmuş olabilir. Hemen açıklayalım: buradaki output tabiki Elastic Search.

Buraya kadar bütün senaryo ve yapılacaklar anlaşıldıysa hemen gerekli kurulum ve işlemlere geçebiliriz. Öncelikle işlemlerimizde hep Docker’ı kullanacağımız için bilgi almak isterseniz Docker ile ilgili yazılarıma göz atabilirsiniz.

Öncelikle bütün işleri yapacak olan Elastic Search kurulumunu yapalım. Çünkü bütün veriler Elastic Search üzerinde toplanacak ve istendiği anda ulaşılabilecek konumda olacak. Kurulumdan önce şunu bilmenizde fayda var. Elastic Search 9200 ve 9300 portlarını kullanıyor ve bunları dışarıya açmak eğer ssl gibi güvenlik mekanizmalarını kullanmayacaksanız tehlikeli olabilir. Bu yüzden elasticsearch kibana logstash üçlüsü aynı makine üzerinde olacaksa  docker link ile bunları kolayca portları dışarıya açmadan bağlayabiliyorsunuz.

Öncelikle elasticsearch ile başlayalım.  Öncelikle esdata adında bir klasör oluşturalım ve elasticsearch’e map edelim.

Burada dikkat edilmesi gereken nokta eğer ElasticSearch’u başka bir makine üzerinde çalıştırmayacaksanız portları dışarıya açmamanız. Bu yüzden docker -p komutunu kullanmadım. Bundan sonra Docker gerekli imajları indirip container’ı ayağa kaldıracaktır. Hemen ardından kibana kurulumuna geçelim. Kibana şimdilik herhangi bir konfigürasyon derdi getirmiyor. Sizin için önemli olan nasıl kullanacağınızı bilmek.

Böylelikle Kibana’da ayağa kalkmış oluyor. Artık localhost 5601 portundan ulaşılabilir durumda olacaktır. Hemen ardından konfigürasyon gerektiren iki adet kurulum daha yapalım:

Öncelikle örnek log dosyamızın satırlarının ne türde olduğunu bilmemiz gerekmekte çünkü elastic search e anlamlı json yapısının gitmesi gerekmektedir. Bu yüzden örnek satırımız:

Yukarıda görülen log mesajında öncelikle tarih, log seviyesi, operasyon adı ve mesaj bulunmakta. Bu satırdan bu bilgileri düzenli ve anlamlı bir şekilde almamız gerekmektedir. Bu yüzden logstash üzerinde regular expression’lar ile çalışan grok pattern’ları bulunmaktadır. Grok bir filtre türüdür. Gelen mesajı düzgün anlamlı bir şekilde ayıklamak için kullanılır. Grok gibi çok plugin Logstash üzerinde mevcuttur. Bu yüzden öncelikle Logstash configürasyon dosyamızı oluşturmamız gerekmektedir. Öncelikle çalışmak için bir logstash klasörü oluşturalım.

Hemen ardından bir içerisine girip config dosyamızı oluşturalım.

ve içerisine örnek logstash config dosyamızı yükleyelim:

 

Gördüğünüz üzere konfigürasyon dosyası üç adet kısımdan oluşmaktadır. Input, filter ve output. Input kısmında filebeat’i kullanacağımızı ve 5044 portundan devam edeceğimizi belirttik. Şimdi geldik en önemli kısıma: yukarıda da belirttiğim gibi log mesajını anlamlı hale getirmek için grok pattern’ları kullanacağımızı belirttim. Ben gelen mesajı

pattern’i ile parse ediyorum. Böylelikle anlamlı mesajların gelmesi sağlanıyor. Peki nereden buldum bu pattern’ları derseniz

https://github.com/elastic/logstash/tree/v1.4.2/patterns adresinden yararlanabilirsiniz. Grok üzerinde belirlenen ön tanımlı pattern’leri kendinize uygun şekilde kullanabilirsiniz. Hemen ardından logstash kurulumuna geçelim isterseniz.

Öncelikle config dosyamızı oluşturduk ve bunu oluşturacağımız logstash container’ına mount etmemiz gerekmektedir. Bu yüzden

Böylelikle logstash hazırda gelecek olan mesajları bekliyor olacaktır. Şimdi bu logları logstash’e ulaştıracak olan FileBeat’i kurmaya sıra geldi 🙂 Daha önce bahsettiğim gibi belirli dosyaları ant tarzı inputlar vererek güncellenen dosyaları okumaya ve bunları yönlendirmeye yarayan bir araç olduğundan bahsettim.

Hemen gerekli klasörümüzü ve yml tarzındaki konfigürasyon dosyamızı oluşturalım.

 

 

Yukarıdaki konfigürasyon dosyamızı açıklayacak olursak: Paths kısmında logs adında her dosyanın okunması gerektiğini belirtiyoruz. Böylelikle filebeat her dosyayı taramaya başlıyor. Burada bilinmesi gereken ekstra bir durum daha var. Log dosyalarınıza göre değişebilecek bir durum aslında. Log dosyalarınız tek satırdan oluşmuyor olabilir. Yani her mesaj tek satırlık olmak zorunda değil. İçerisinde json türünde bilgi mesajları olabilir veya Java Stack Trace’i barındırabilir. İşte bu yüzden multiline kullanıyoruz ve pattern’ini regex türünde veriyoruz. Diyoruz ki sonraki satırlar eğer ki boşluk veya } veya ) şeklinde başlıyorsa bu yukarıda okunan satırın devamıdır ve mesaja bunları da ekle. Bunu kendi log dosyanıza göre değiştirebilirsiniz. Birde output kısmından bahsetmek istiyorum. Burada debug açısından rahat olsun diye hem logstash hem de console kullanıldı. Dosyalar okundu mu okunmadı mı diye kontrolünü sağlamak en başlarda büyük önem taşıyabiliyor. İsterseniz ilerde console’u konfigürasyon dosyanızdan kaldırabilirsiniz. Ayrıca logs klasörümüzün de olması gerekmektedir ve bu klasörümüzün olduğunu varsayıyoruz.

Böylelikle hem loglarımızın olduğu klasör, hemde konfigürasyon dosyamız mount edilmiş oldu. Bundan sonra log dosyamıza yeni şeyler eklemeyi deneyelim ve console’dan kontrol edelim 🙂 Hemen ardınadn kibana ile kontrolünü sağlayalım. Bunun için http://localhost:5601 ile kibana konsoluna ulaşabiliyorsunuz.

Screen-Shot-2015-02-17-at-3.30.30-PM-1024x715

 

Hepsi bu kadar 🙂

Bu yazı Yazılarım kategorisine gönderilmiş ve , , , , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir