ELK Stack Kurulumu: Elasticsearch, Logstash ve Kibana
Üretim ortamında yüzlerce sunucudan akan logları tail -f ile takip etmeye çalışmak, bir süre sonra kaosa dönüşüyor. Kim neye baktı, hangi servis ne zaman hata verdi, o 500 hatası neden oldu? Bu soruların cevabını bulmak için saatlerce grep’lemek yerine, ELK Stack kurarak tüm log altyapınızı merkezileştirebilirsiniz. Bu yazıda sıfırdan çalışan bir ELK ortamı kuracağız, gerçek dünya senaryolarıyla yapılandıracağız ve production’a hazır hale getireceğiz.
ELK Stack Nedir ve Neden Kullanmalısınız?
ELK Stack, üç açık kaynak aracın bir araya gelmesiyle oluşan güçlü bir log yönetim platformudur.
- Elasticsearch: JSON tabanlı, dağıtık arama ve analitik motoru. Loglarınızı saklar ve milisaniyeler içinde arama yapmanızı sağlar.
- Logstash: Veri toplama, dönüştürme ve iletme pipeline’ı. Farklı kaynaklardan gelen logları alır, işler ve Elasticsearch’e gönderir.
- Kibana: Elasticsearch üzerindeki veriler için görselleştirme ve dashboard arayüzü. Tarayıcıdan tüm loglarınıza bakabilirsiniz.
Günümüzde bu üçlüye Beats ailesi de eklenmiştir. Filebeat, Metricbeat gibi hafif ajanlar sunucularınıza kurulur ve log ile metrikleri toplar. Modern dünyada bu yapıya genellikle Elastic Stack denmektedir.
Bir e-ticaret şirketini düşünün: 20 uygulama sunucusu, 5 veritabanı, birkaç load balancer. Gece 2’de sitenin yavaşladığını anlamak için tüm sunuculara SSH bağlantısı açmak yerine, tek bir Kibana dashboard’undan her şeyi görebilmek hayat kurtarır.
Sistem Gereksinimleri ve Hazırlık
Bu rehberde Ubuntu 22.04 LTS üzerinde çalışacağız. Production için minimum önerim:
- Elasticsearch: 4 CPU, 8 GB RAM, 100 GB SSD (log hacminize göre artırın)
- Logstash: 2 CPU, 4 GB RAM
- Kibana: 2 CPU, 2 GB RAM
Test ortamı için her şeyi tek bir sunucuya kurabilirsiniz ancak production’da ayrı sunucular kullanmanızı şiddetle tavsiye ederim.
Başlamadan önce sistemi güncelleyelim ve Java kuruyoruz çünkü hem Elasticsearch hem Logstash Java’ya ihtiyaç duyuyor:
sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https curl gnupg2 openjdk-17-jdk
# Java kurulumunu doğrula
java -version
# Elastic GPG anahtarını ekle
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
# Repository ekle
echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
Elasticsearch Kurulumu ve Yapılandırması
Elasticsearch kurulumu oldukça basit ama yapılandırma kritik öneme sahip:
sudo apt install -y elasticsearch
# Servis otomatik başlatma
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
Şimdi ana yapılandırma dosyasını düzenleyelim:
sudo nano /etc/elasticsearch/elasticsearch.yml
Dosyaya aşağıdaki ayarları ekleyin veya mevcut değerleri güncelleyin:
# Cluster adı - tüm node'lar aynı ismi kullanmalı
cluster.name: production-logs
# Node adı - her node için benzersiz olmalı
node.name: elk-node-01
# Veri ve log dizinleri
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
# Ağ ayarları - sadece kendi IP'nizi yazın
network.host: 0.0.0.0
http.port: 9200
# Single node cluster için discovery ayarı
discovery.type: single-node
# Security ayarları - production'da mutlaka açık olsun
xpack.security.enabled: true
xpack.security.enrollment.enabled: true
JVM heap boyutunu ayarlayalım. Genel kural: mevcut RAM’in yarısını Elasticsearch’e verin ama 32 GB’ı geçmeyin:
sudo nano /etc/elasticsearch/jvm.options.d/heap.options
# 8 GB RAM'li sunucu için
-Xms4g
-Xmx4g
Elasticsearch’i yeniden başlatın ve built-in şifreleri oluşturun:
sudo systemctl restart elasticsearch
# Built-in kullanıcılar için şifre oluştur
sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto
# Çıktıyı MUTLAKA kaydedin! elastic, kibana_system, logstash_system şifrelerini not alın
Kurulumu test edelim:
curl -u elastic:SIFRENIZI_BURAYA_YAZIN https://localhost:9200 --cacert /etc/elasticsearch/certs/http_ca.crt
# Cluster sağlık durumunu kontrol et
curl -u elastic:SIFRENIZI_BURAYA_YAZIN "https://localhost:9200/_cluster/health?pretty" --cacert /etc/elasticsearch/certs/http_ca.crt
Başarılı bir yanıtta "status": "green" veya "yellow" görmelisiniz. Single node kurulumda yellow normal, production cluster’da green hedeflemelisiniz.
Kibana Kurulumu ve Yapılandırması
Kibana kurulumu Elasticsearch’e göre daha kolaydır:
sudo apt install -y kibana
Kibana yapılandırma dosyasını düzenleyelim:
sudo nano /etc/kibana/kibana.yml
# Kibana'nın dinleyeceği port ve adres
server.port: 5601
server.host: "0.0.0.0"
server.name: "elk-server"
# Elasticsearch bağlantısı
elasticsearch.hosts: ["https://localhost:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "KIBANA_SYSTEM_SIFRESI"
# SSL sertifikası
elasticsearch.ssl.certificateAuthorities: ["/etc/elasticsearch/certs/http_ca.crt"]
elasticsearch.ssl.verificationMode: certificate
# Kibana şifreleme anahtarları - openssl rand -hex 32 ile üretin
xpack.security.encryptionKey: "buraya_32_karakter_rastgele_deger"
xpack.encryptedSavedObjects.encryptionKey: "buraya_baska_32_karakter_deger"
# Türkçe log tarihleri için
i18n.locale: "en"
sudo systemctl enable kibana
sudo systemctl start kibana
# Status kontrol
sudo systemctl status kibana
Kibana başlamak için biraz zaman alabilir. Logları takip edin:
sudo journalctl -u kibana -f
http://SUNUCU_IP:5601 adresine gidin ve elastic kullanıcısıyla giriş yapın.
Logstash Kurulumu ve Pipeline Yapılandırması
Logstash, ELK Stack’in en esnek ve bir o kadar da karmaşık parçasıdır. Input, Filter ve Output olmak üç temel bölümden oluşan pipeline’lar yazarsınız.
sudo apt install -y logstash
Logstash’in Elasticsearch’e bağlanabilmesi için sertifikayı kopyalayalım:
sudo mkdir -p /etc/logstash/certs
sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/logstash/certs/
sudo chown -R logstash:logstash /etc/logstash/certs
Şimdi gerçek dünyadan bir senaryo ile başlayalım. Nginx access loglarını toplayacak bir pipeline oluşturalım:
sudo nano /etc/logstash/conf.d/nginx-logs.conf
input {
beats {
port => 5044
}
}
filter {
if [fields][log_type] == "nginx_access" {
grok {
match => {
"message" => '%{COMBINEDAPACHELOG}'
}
}
# IP'den coğrafi konum bilgisi al
geoip {
source => "clientip"
target => "geoip"
}
# HTTP durum kodunu integer'a çevir
mutate {
convert => {
"response" => "integer"
"bytes" => "integer"
}
}
# 5xx hataları için özel alan ekle
if [response] >= 500 {
mutate {
add_field => { "error_level" => "critical" }
add_tag => ["server_error"]
}
} else if [response] >= 400 {
mutate {
add_field => { "error_level" => "warning" }
add_tag => ["client_error"]
}
}
# Gereksiz alanları temizle
mutate {
remove_field => ["message", "host", "agent"]
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
}
}
output {
elasticsearch {
hosts => ["https://localhost:9200"]
user => "elastic"
password => "ELASTIC_SIFRENIZI_BURAYA_YAZIN"
cacert => "/etc/logstash/certs/http_ca.crt"
index => "nginx-access-%{+YYYY.MM.dd}"
}
# Debug için stdout'a da yaz - production'da kapat
# stdout { codec => rubydebug }
}
Pipeline’ı test edin ve başlatın:
# Konfigürasyonu test et
sudo /usr/share/logstash/bin/logstash --config.test_and_exit -f /etc/logstash/conf.d/nginx-logs.conf
# Servisi başlat
sudo systemctl enable logstash
sudo systemctl start logstash
Filebeat ile Log Toplama
Logstash’i her sunucuya kurmak yerine, hafif bir ajan olan Filebeat kullanmak çok daha akıllıca. Log üretilen sunuculara Filebeat kurulur, merkezi Logstash’e gönderir.
Nginx sunucunuzda:
sudo apt install -y filebeat
sudo nano /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
environment: production
server_name: web-01
fields_under_root: false
- type: log
enabled: true
paths:
- /var/log/nginx/error.log
fields:
log_type: nginx_error
environment: production
# Output - Logstash'e gönder
output.logstash:
hosts: ["ELK_SUNUCU_IP:5044"]
# Kibana bağlantısı - dashboard'lar için
setup.kibana:
host: "ELK_SUNUCU_IP:5601"
# Processors - gereksiz alanları temizle
processors:
- drop_fields:
fields: ["log.offset"]
ignore_missing: true
sudo systemctl enable filebeat
sudo systemctl start filebeat
# Bağlantıyı test et
sudo filebeat test output
Index Template ve ILM Politikası
Production ortamında log verisi hızla büyür. Index Lifecycle Management (ILM) ile eski verileri otomatik olarak arşivleyin veya silin.
Kibana’dan Dev Tools’u açın (Sol menüde wrench ikonu) ve şu komutu çalıştırın:
# ILM politikası oluştur
PUT _ilm/policy/nginx-log-policy
{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "1d"
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
}
}
},
"delete": {
"min_age": "30d",
"actions": {
"delete": {}
}
}
}
}
}
Bu politika ile loglar 1 günde bir yeni index’e aktarılır, 7 gün sonra “warm” fazına geçerek sıkıştırılır ve 30 gün sonra otomatik silinir. İhtiyacınıza göre bu süreleri ayarlayın.
Kibana Dashboard ve Alarm Kurulumu
Kibana’da anlamlı dashboard’lar oluşturmak için önce Index Pattern (Data View) tanımlamalısınız.
- Kibana’da sol menüden Stack Management > Data Views gidin
- Create data view tıklayın
- Index pattern olarak
nginx-access-*yazın - Timestamp field olarak
@timestampseçin
Artık Discover bölümünden tüm nginx loglarını görebilirsiniz. Birkaç kullanışlı Kibana Lens sorgusu:
# HTTP 5xx hatalarını göster - KQL syntax
response >= 500
# Belirli bir IP'den gelen istekler
clientip: "192.168.1.100"
# Son 1 saatte 404 alan URL'ler
response: 404 AND @timestamp >= now-1h
# Yavaş istekler (request time > 2 saniye)
request_time > 2.0
Alarm kurmak için Stack Management > Rules and Connectors bölümüne gidin. 5 dakika içinde 10’dan fazla 500 hatası gelirse e-posta gönderen bir alarm örneği oluşturabilirsiniz. Üretimde bu tip alarmlar gece çağrılarını önemli ölçüde azaltır.
Güvenlik Sertleştirmesi
Varsayılan kurulum yeterli değildir. Production’da mutlaka yapılması gerekenler:
# Elasticsearch portlarını dışarıya açmayın, nginx reverse proxy kullanın
sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/kibana
server {
listen 443 ssl;
server_name kibana.sirketiniz.com;
ssl_certificate /etc/ssl/certs/kibana.crt;
ssl_certificate_key /etc/ssl/private/kibana.key;
ssl_protocols TLSv1.2 TLSv1.3;
# Temel auth ekleyebilirsiniz ya da Kibana kendi auth'unu yönetir
location / {
proxy_pass http://localhost:5601;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Elasticsearch için güvenlik duvarı kuralları:
# UFW ile sadece gerekli portları aç
sudo ufw allow 443/tcp # Kibana HTTPS (nginx üzerinden)
sudo ufw allow 5044/tcp # Logstash Beats input (sadece iç network)
sudo ufw deny 9200/tcp # Elasticsearch'ü dışarıya asla açmayın
sudo ufw deny 5601/tcp # Kibana'yı nginx arkasına alın
sudo ufw enable
Elasticsearch’te kullanıcı bazlı erişim kontrolü için Kibana üzerinden roller oluşturun. Geliştirici ekibine sadece okuma yetkisi, ops ekibine tam yetki gibi ayrımlar yapabilirsiniz.
Performans Tuning ve Yaygın Sorunlar
Birkaç yıllık ELK deneyiminden öğrendiğim kritik ayarlar:
Elasticsearch için:
# Sistem seviyesinde önemli ayarlar
sudo nano /etc/security/limits.conf
# Bu satırları ekle
elasticsearch soft nofile 65535
elasticsearch hard nofile 65535
elasticsearch soft nproc 4096
elasticsearch hard nproc 4096
# Virtual memory ayarı - Elasticsearch şikayetçi olursa
sudo sysctl -w vm.max_map_count=262144
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
Logstash için:
Logstash yavaş ise pipeline worker sayısını artırın:
sudo nano /etc/logstash/logstash.yml
# CPU sayısına göre ayarlayın
pipeline.workers: 4
pipeline.batch.size: 500
pipeline.batch.delay: 50
# Heap boyutu - logstash.yml ile değil jvm.options ile ayarlanır
Sık karşılaşılan sorunlar ve çözümleri:
- Elasticsearch başlamıyor:
sudo journalctl -u elasticsearch -n 50ile hata loglarına bakın. Çoğunlukla heap boyutu veya disk doluluk sorunudur. - Logstash grok pattern tutmuyor: [Grok Debugger](https://grokdebug.herokuapp.com) sitesinde pattern’ınızı test edin veya Kibana’daki built-in Grok Debugger’ı kullanın.
- Filebeat veri göndermiyor:
sudo filebeat test outputkomutu ile bağlantıyı kontrol edin, Logstash portuna firewall bloke ediyor olabilir. - Disk doldu: ILM politikasını gözden geçirin, gereksiz eski index’leri silin.
GET _cat/indices?s=store.size:desc&vkomutu ile en büyük index’leri listeleyin. - Kibana yavaş: Elasticsearch’e verilen heap yetersiz olabilir. Ayrıca çok geniş zaman aralıklarında sorgu çalıştırmaktan kaçının.
Monitoring: ELK’yı Kendisi ile İzleyin
Elastic Stack, kendini izleme özelliğine sahiptir. Kibana’dan Stack Monitoring bölümüne gidin ve built-in monitoring’i aktif edin. Elasticsearch node’larının durumunu, JVM heap kullanımını, indexing hızını ve query latency’sini buradan görebilirsiniz.
Alternatif olarak Metricbeat’i ELK sunucusuna kurarak sistem metriklerini de Elasticsearch’e gönderebilirsiniz:
sudo apt install -y metricbeat
sudo metricbeat modules enable elasticsearch-xpack kibana-xpack logstash-xpack system
sudo systemctl enable metricbeat
sudo systemctl start metricbeat
Bu sayede Kibana’dan hem loglarınızı hem de ELK altyapınızın sağlığını izleyebilirsiniz.
Sonuç
ELK Stack kurmak başlangıçta göz korkutucu görünse de, parça parça ilerlediğinizde oldukça anlaşılır bir yapıya sahip. Önce tek sunucuda test edin, pipeline’larınızı olgunlaştırın, sonra production’a taşıyın.
Bu rehberle birlikte elinizde çalışan bir ELK ortamı, Nginx loglarını toplayan bir Filebeat konfigürasyonu, ILM ile otomatik yönetilen index’ler ve temel güvenlik sertleştirmesi var. Bunları temel alarak MySQL slow query logları, uygulama hata logları, Syslog ve Windows Event Log gibi kaynakları ekleyebilirsiniz.
Bir uyarıyla bitireyim: Elasticsearch’ün disk tüketimi beklenmedik hızda artabilir. İlk haftada log hacminizi ölçün ve ILM politikalarınızı ona göre ayarlayın. Disk dolduğunda Elasticsearch cluster’ı read-only moda geçirir ve kurtarmak ciddi zaman alır. Disk kullanımına alarm kurmak ilk yapmanız gereken şeylerden biri olsun.
