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.