Graylog nedir?

Graylog, sunucular, ağ cihazları, uygulamalar ve kendi yazdığınız kodlarla üreteceğiniz log (kayıt) dosyalarını toplamanıza ve işlemenize olanak sağlayan bir araçlar paketi.

Graylog gibi bir merkezi log tutma çözümüne ihtiyacım var mı?

Bana kalırsa geliştirme ortamında veya basit bir üretim ortamında Graylog kullanmak çok gerekli değil, gerçekten karmaşık bir tech-stackiniz, bol miktarda sunucunuz, dağıtık bir sunucu yapınız varsa gerekli olabilir. Eğer dağıtık bir sistem olmayacaksa, loglamayı dosya sisteminde yapıp, doğru düzgün bir log-viewer çözümü ile de yaşayabilrsiniz. Dağıtık bir sisteminiz varsa, çok fazla logunuz varsa, bu loglarla ilgili analizler yapmak, belirli uyarılar almak istiyorsanız Graylog (veya Logstah, FluentD) gibi merkezi bir log çözümüne ihtiyacınız olacaktır.

PHP özelinde konuşursak Monolog gibi PSR-3 tabanlı bir loglama çözümü kullanıyorsanız dosya sistemi ile başladığınız log yapınızı, başka bir sisteme taşımanı gayet kolay olacaktır. Bu nedenle basitten başlamakta fayda var.

Graylog kurulumu nasıl yapılır?

Ben kurulumu Docker konteynerleri üzerinde, ‘geliştirme’ ortamı için yapacağım, üretim ortamı için paketteki tüm sunucuların ayarlarına biraz daha fazla girmeniz gerekebilir. Graylog’un sitesindeki Docker dokümantasyonunda “Üretim ortamı için önermiyoruz” ifadesinin nedeni, Docker ile kolayca kurup, kutudan çıktığı gibi kullanmanın önerilmiyor olması. Docker işleri o kadar kolay hale getiriyor ki genellikle ayarlara hiç dokunmadan varsayılan ayarlarla kullanıp geçiyoruz.

Graylog kurulumu için gerekenler nedir?

Graylog çalışmak için ElasticSearch ve MongoDb’ye ihtiyaç duyuyor. ElasticSearch logların tutulması, MongoDB ayarlar, tercihler vb. seçenekleri kaydetmesi için kullanılıyor. Asıl veri ElasticSearch’de döndüğü için MongoDB kullanımı yok denecek kadar az. Mevcut bir MongoDB kurulumunuz varsa önemli bir yük bindirmeden onu kullanmanız mümkün.

ElasticSearch için tavsiye edilen minimum bellek miktarı 2 GB, Graylog içinde min. 512 MB tavsiye ediliyor, birde Mongo DB çalışacağını hesaba katınca asgari seviyede çalışması için min. 3-4 GB belleği olan bir sunucu gerekiyor.

Bu ihtiyaçlar geliştirme ortamında kullanmak için çok uygun değil, özellikle de geliştirme ortamınız bir VPS üzerindeyse. Ben 2GB bellekli mütevazi VPS’imde sistemi zorla çalışır hale getirdim, amacım kullanmak değil, çalıştığını görmekti.

Eğer VPS sunucunuz AWS üzerindeyse ve henüz 12 aylık “FREE TIER” – “ÜCRETSİZ KULLANIM” dönemindeyseniz kaynak problemini WS’nin ElasticSearch servisini kullanarak da aşabilirsiniz.

Yöntem 1: GrayLog + ElasticSearch + MongoDB + Logspout’un yerel kurulumu

Graylog + ElasticSearch + MongoDB temel paketimiz. Bunları Docker üzerinde kurduğunuza göre Docker konteyner loglarını Graylog’a yönlendirmenizi sağlayan LogSpout’u da yanında kuralım. (İsteğe Bağlı)

Kurulumun ilk aşaması olarak GrayLog, ElasticSearch ve MongoDB için yerel dizinlerimizi oluşturalım. ElasticSearch ve MongoDB için birer data ve config dizini, Graylog içinde bir data ve plugin dizini oluşturmalısınız. Bu dizinleri konteynerlerdeki ilgili dizinlerle eşleyerek yerel makinenizde ulaşılabişir olmalarını sağlayacağız. Böylece ayar dosyalarını kolayca düzenleyip, verilerin yedeklerini de daha kolay alabileceksiniz.

İlgili dizinleri oluşturduktan sonra aşağıda paylaşacağım docker-compose dosyasını kendi isteğinize göre düzenleyin.

<MONGODB_VERI_DIZINI_YOLU> şeklinde yazdığım bölümlere az önce oluşuturduğunuz dizinlerin yolunu yazın.

Benim sunucu kaynaklarım sınırlı olduğu için ElasticSearch’i azami bellek miktarını ayarlardan 1GB’ye indirip, bir çok diğer konteyneri de kapattığımda çalışır hale getirebildim. Eğer sizin daha güçlü bir sunucunuz varsa ilgili ayarları yükseltebilirsiniz.

Graylog’un varsayılan 9000 portu ile Portainer’i kulladığım port çakıştığı için ben Graylog’u 9090 portuna aldım, gerekirse size portu değiştirebilirsiniz.

Son olarak <ADRES> şeklinde yazdığım bölüm Graylog’a ulaşmak istediğiniz URL’e göre ayarlanmalıdır.

#Docker-compose for Graylog
 version: '2'
 services:
   mongodb:
     image: mongo:4.2
     command: "mongod --config /conf/mongo.conf"
     volumes:
       - <MONGODB_VERI_DIZINI_YOLU>:/data
       - <MONGODB_AYAR_DIZINI_YOLU>:/conf/
   elasticsearch:
     image: elasticsearch:7.11.1
     command: "elasticsearch -dsE cluster.name=graylog"
     volumes:
       - <ELASTICSEARCH_VERI_DIZINI_YOLU>:/usr/share/elasticsearch/data
       - <ELASTICSEARCH_AYAR_DIZIN I_YOLU>/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
       - <ELASTICSEARCH_AYAR_DIZINI_YOLU>/logging.yml:/usr/share/elasticsearch/config/logging.yml:ro
     environment:
#SİZ BUNU DAHA YÜKSEK YAPABİLİRSİNİZ
       ES_MAX_MEM: 1g
     ports:
      - 9200:9200
      - 9300:9300
     ulimits:
       memlock:
         soft: -1
         hard: -1
       nofile:
         soft: 65536
         hard: 65536
     mem_limit: 1024m
 graylog:
     image: graylog/graylog:4.0
     environment:
# Kullanmak istediğiniz şifreleri aşağıdaki şekilde belirtmezseniz web panele varsayılan admin/admin şifresi ile bağlanırsınız.
#       GRAYLOG_PASSWORD_SECRET: Bgw7mYROifuwMCojIcuQ0PYCiuwtOWNSIQBV6fbIfNIzpFFxKrVcRDOxJOPBmjHPhOA5uT928Ll9LlfpPEWxsy9a4VSgZebo
#       GRAYLOG_ROOT_PASSWORD_SHA2: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
       GRAYLOG_WEB_ENDPOINT_URI: http:/<ADRES>:9090/api
       GRAYLOG_HTTP_PUBLISH_URI: http:/<ADRES>:9090/
       GRAYLOG_HTTP_EXTERNAL_URI: http:/<ADRES>:9090/
       GRAYLOG_MONGODB_URI: mongodb://mongodb/graylog
       GRAYLOG_MONGODB_MAX_CONNECTIONS: 100
       GRAYLOG_MONGODB_THREADS_ALLOWED_TO_BLOCK_MULTIPLIER: 5
       GRAYLOG_ELASTICSEARCH_CLUSTER_NAME: graylog
     volumes:
       - <GRAYLOG_VERI_DIZINI_YOLU>:/opt/graylog/data
       - <GRAYLOG_EKLENTI_DIZINI_YOLU>:/opt/graylog/plugin/
/etc/graylog/server/server.conf
     links:
       - elasticsearch:elasticsearch
       - mongodb:mongodb
     ports:
   #DIŞ 9000 PORTU PORTAINER TARAFINDAN KULLANILDIĞI İÇİN BAŞKA BİR PORT SEÇELİM
       - 9090:9000
       - 12201:12201/udp
       - 1514:1514/udp

   # Based on Logspout by Gliderlabs
   # https://github.com/gliderlabs/logspout
   #
   # micahhausler created a module to send Docker logs
   # from logspout to Graylog:
   # https://github.com/micahhausler/logspout-gelf
   logspout:
     image: "micahhausler/logspout:gelf"
     hostname: logspout
     command: "gelf://graylog:12201"
     environment:
       LOGSPOUT: ignore
     volumes:
       - "/var/run/docker.sock:/var/run/docker.sock"
     links:
       - "graylog:graylog"
     ports:
       - 8081:80

Compose dosyamızı oluşturduk, şimdi bu dosyada atıfta bulunduğumuz ‘config’ dosyalarını oluşturalım;

MongoDB için belirttiğiniz config dizini içinde “mongo.conf” isimli dosyayı oluşturup içeriğini şöyle düzenleyin

storage:
   engine: wiredTiger
   dbPath: "/data/db"
   directoryPerDB: true
   journal:
     enabled: true
 systemLog:
   timeStampFormat: iso8601-utc
 processManagement:
   fork: false
 net:
   port: 27017
   wireObjectCheck : true
   unixDomainSocket:
     enabled : true

ElasticSearch için belirttiğiniz config dizini içinde “elasticsearch.yml” dosyasını oluşturup içeriğini şu şekilde düzenlyin;

network.host: 0.0.0.0
action.auto_create_index: true

ElasticSearch için belirttiğiniz config dizini içinde “logging.yml” dosyasını oluşturup içeriğini şu şekilde düzenlyin;

es.logger.level: INFO
 rootLogger: ${es.logger.level}, console
 logger:
   action: DEBUG
 appender:
   console:
     type: console
     layout:
       type: consolePattern
       conversionPattern: "[%d{ISO8601}][%-5p][%-25c] %m%n"

Bu Composer dosyasını hazırlayıp docker-compose up -d komutu ile ayağa kaldırdığınızda Graylog, ElasticSearch, MongoDB ve Logspout’dan oluşan paketiniz hazır hale gelecek.

Yöntem 2: GrayLog + MongoDB + Logspout’u yerel olarak kurup, ElasticSearch’ü uzaktan kullanmak

İkinci bir yöntem ise ElasticSearch’ü bu kurulumdan ayrı tutup AWS gibi ‘yönetilen bir ElasticSearch’ servisi üzerinden kullanmak. AWS bir örnek, ihtiyacınız olan uzaktaki bir ElasticSearch sunucusunun size erişim veren ENDPOINT adresi. ElasticSearch kurulumu gayet pratik, 3-5 dakika içinde kullanılabilir hale getirip ENDPOINT adreslerini de AWS Console panelinden görebiliyorsunuz.

Sonuç olarak yukarıdakine çok benzer bir compose dosyamız var. Tek fark ElasticSearch bölümünü çıkartıp, Gray’log’a uzak ElasticSearch endpoint’ini tanımlamış olmamız. Bunun için bu değeri GRAYLOG_ELASTICSEARCH_HOSTS ortam değişkenine tanımlamanız yeterli.

Docker-compose for Graylog
 version: '2'
 services:
   mongodb:
     image: mongo:4.2
     command: "mongod --config /conf/mongo.conf"
     volumes:
       - <MONGODB_VERI_DIZINI_YOLU>:/data
       - <MONGODB_AYAR_DIZINI_YOLU>:/conf/
   graylog:
     image: graylog/graylog:4.0
     environment:
       GRAYLOG_WEB_ENDPOINT_URI: http:/<ADRES>:9090/api
       GRAYLOG_HTTP_PUBLISH_URI: http:/<ADRES>:9090/
       GRAYLOG_HTTP_EXTERNAL_URI: http:/<ADRES>:9090/
       GRAYLOG_MONGODB_URI: mongodb://mongodb/graylog
       GRAYLOG_MONGODB_MAX_CONNECTIONS: 100
       GRAYLOG_MONGODB_THREADS_ALLOWED_TO_BLOCK_MULTIPLIER: 5
       GRAYLOG_ELASTICSEARCH_HOSTS: <ELASTIC_SEARCH_ENDPOINT_URI>
     volumes:
       - <GRAYLOG_VERI_DIZINI_YOLU>:/opt/graylog/data
       - <GRAYLOG_EKLENTI_DIZINI_YOLU>:/opt/graylog/plugin/
     links:
       - mongodb:mongodb
     ports:
       - 9090:9000
       - 12201:12201/udp
       - 1514:1514/udp
 # Based on Logspout by Gliderlabs
   # https://github.com/gliderlabs/logspout
   #
   # micahhausler created a module to send Docker logs
   # from logspout to Graylog:
   # https://github.com/micahhausler/logspout-gelf
   logspout:
     image: "micahhausler/logspout:gelf"
     hostname: logspout
     command: "gelf://graylog:12201"
     environment:
       LOGSPOUT: ignore
     volumes:
       - "/var/run/docker.sock:/var/run/docker.sock"
     links:
       - "graylog:graylog"
     ports:
       - 8081:80

docker-compose up -d komutu ile ayağa kaldırdığıız bu üçlü boşta beklerken 250-300 MB’lık bir bellek kullanıyor, sadece ElasticSearch’ü dışarı alarak basit bir VPS’de bile çalıştırabilirsiniz.

Sorularınız varsa veya fikir alışverişi yapmak isterseniz yorumlardan, Twitter , LinkedIn veya Instagram üzerinden ulaşabilirsiniz. Sevgiler…

Bu Yazıda Yapılan Değişiklikler
  • 11.05.2022: Yazı özeti düzenlendi.