Filebeat ile Log Toplama ve Elasticsearch Entegrasyonu
Production ortamında onlarca, belki yüzlerce sunucudan log toplamak gerçek bir kabus olabilir. SSH ile sunucudan sunucuya atlayıp log dosyalarına bakmak, ciddi bir operasyonel yük oluşturur. İşte tam bu noktada Filebeat devreye giriyor. Filebeat, Elastic Stack’in hafif ve güvenilir log shipper’ı olarak, log dosyalarını merkezi bir noktaya taşımanın en pratik yollarından birini sunuyor. Bu yazıda Filebeat’i sıfırdan kurarak Elasticsearch ile entegre etmeyi, gerçek dünya senaryoları üzerinden adım adım inceleyeceğiz.
Filebeat Nedir ve Neden Kullanmalıyız?
Filebeat, Elastic tarafından geliştirilen, Go ile yazılmış hafif bir log shipper’dır. Logstash’in aksine, Filebeat minimum kaynak tüketimiyle çalışır ve production sunucularında yan etki yaratmadan log toplama işini halleder. Temel mimarisi basittir: dosyaları izler, yeni satırları okur ve hedef sisteme (Elasticsearch, Logstash veya Kafka gibi) iletir.
Birkaç önemli özelliği var:
- Backpressure-sensitive protokol: Hedef sistem yavaşlarsa Filebeat da yavaşlar, veri kaybetmez
- At-least-once delivery: Her log satırının en az bir kez iletilmesi garanti altındadır
- Registry dosyası: Kaldığı yerden devam eder, sunucu yeniden başlasa bile logları tekrar baştan okumaz
- Modules: Nginx, Apache, MySQL gibi popüler uygulamalar için hazır konfigürasyonlar içerir
- Multiline desteği: Java stack trace gibi çok satırlı logları tek event olarak işleyebilir
Tipik bir senaryoda şöyle çalışır: 10 tane uygulama sunucunuz var, her birinde Filebeat çalışıyor ve /var/log/nginx/access.log ile /var/log/app/*.log dosyalarını izliyor. Tüm bu loglar merkezi Elasticsearch cluster’ınıza akıyor ve Kibana üzerinden tek bir yerden izleyebiliyorsunuz.
Kurulum Öncesi Hazırlık
Kuruluma geçmeden önce ortamın hazır olduğundan emin olalım. Bu yazıda Ubuntu 22.04 LTS üzerinde çalışıyoruz ve Elasticsearch 8.x kullanıyoruz.
Elasticsearch ve Kibana’nın zaten kurulu ve çalışıyor olduğunu varsayıyorum. Eğer kurulu değilse, önce o adımları tamamlamanız gerekiyor. Filebeat versiyonunun Elasticsearch versiyonuyla eşleşmesi kritik önem taşıyor, versiyon uyumsuzluğu garip hatalara yol açabilir.
Sistem gereksinimlerini kontrol edelim:
# İşletim sistemi ve kernel versiyonu
uname -a
cat /etc/os-release
# Disk alanı kontrolü (log dosyaları hızla büyüyebilir)
df -h /var/log
# Mevcut Elasticsearch bağlantısını test et
curl -XGET "http://elasticsearch-host:9200" -u elastic:sifreniz
# Zaman senkronizasyonu kritik önem taşır
timedatectl status
Zaman senkronizasyonu özellikle önemli. Log’larda timestamp’ler yanlış sıralandığında debugging inanılmaz zorlaşıyor. NTP servisinin çalıştığından emin olun.
Filebeat Kurulumu
Elastic’in resmi APT repository’sini ekleyerek kurulumu yapalım:
# Elastic GPG anahtarını ekle
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# APT transport HTTPS paketini kur
sudo apt-get install apt-transport-https
# Repository'yi ekle
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
# Paket listesini güncelle ve Filebeat'i kur
sudo apt-get update && sudo apt-get install filebeat
# Servis durumunu kontrol et
sudo systemctl status filebeat
RPM tabanlı sistemler (CentOS/RHEL/Rocky Linux) için:
# RPM GPG anahtarını import et
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# Repo dosyasını oluştur
cat > /etc/yum.repos.d/elasticsearch.repo << 'EOF'
[elasticsearch]
name=Elasticsearch repository for 8.x packages
baseurl=https://artifacts.elastic.co/packages/8.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
# Filebeat'i kur
sudo dnf install filebeat -y
Temel Konfigürasyon
Ana konfigürasyon dosyası /etc/filebeat/filebeat.yml içinde bulunuyor. Bu dosyayı düzenlemeden önce bir yedeğini alın:
sudo cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.bak
Şimdi temel bir konfigürasyon yazalım. Bu konfigürasyon Nginx access loglarını topluyor:
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
fields:
app: nginx
environment: production
server: web-01
fields_under_root: true
- type: log
enabled: true
paths:
- /var/log/myapp/*.log
fields:
app: myapp
environment: production
fields_under_root: true
multiline.pattern: '^d{4}-d{2}-d{2}'
multiline.negate: true
multiline.match: after
multiline.max_lines: 500
# Elasticsearch output
output.elasticsearch:
hosts: ["https://elasticsearch-host:9200"]
username: "elastic"
password: "guclu-sifreniz"
ssl.certificate_authorities: ["/etc/filebeat/certs/ca.crt"]
index: "filebeat-%{[fields.app]}-%{+yyyy.MM.dd}"
# Index template ayarları
setup.template.name: "filebeat"
setup.template.pattern: "filebeat-*"
setup.ilm.enabled: true
setup.ilm.rollover_alias: "filebeat"
# Kibana bağlantısı (dashboard kurulumu için)
setup.kibana:
host: "https://kibana-host:5601"
username: "elastic"
password: "guclu-sifreniz"
# Genel ayarlar
logging.level: info
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0640
fields_under_root: true olduğunda özel alanlar log event’in kök seviyesine eklenir, false olduğunda fields objesi altında kalır. Genellikle true tercih edilir, çünkü Kibana’da filtreleme yaparken daha temiz görünür.
Multiline Log Konfigürasyonu
Gerçek dünyada en çok karşılaşılan sorunlardan biri Java exception’larının doğru parse edilmesidir. Stack trace’ler onlarca satır olabilir ve bunların tek bir event olarak işlenmesi gerekir:
filebeat.inputs:
- type: log
enabled: true
paths:
- /opt/tomcat/logs/catalina.out
- /var/log/java-app/*.log
fields:
app: java-backend
fields_under_root: true
# Tarih ile başlayan satırlar yeni event başlangıcıdır
multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}'
multiline.negate: true
multiline.match: after
multiline.max_lines: 1000
multiline.timeout: 5s
# Encoding problemi yaşanıyorsa
encoding: utf-8
multiline.pattern: Hangi regex deseni yeni event başlangıcını belirliyor multiline.negate: true olduğunda pattern’e UYMAYAN satırlar önceki satıra eklenir multiline.match: after demek “pattern’e uymayan satırları bir önceki satırın arkasına ekle” anlamına gelir multiline.timeout: Bu süre geçince beklemedeki satırlar zorla gönderilir
Filebeat Modülleri
Filebeat’in en güçlü özelliklerinden biri hazır modülleri. Nginx, Apache, MySQL, PostgreSQL, Auditd gibi popüler uygulamalar için önceden hazırlanmış parser’lar ve Kibana dashboard’ları içeriyor.
# Mevcut modülleri listele
sudo filebeat modules list
# Nginx modülünü etkinleştir
sudo filebeat modules enable nginx
# MySQL modülünü etkinleştir
sudo filebeat modules enable mysql
# Sistem logları için system modülü
sudo filebeat modules enable system
Nginx modülünü konfigüre edelim:
# /etc/filebeat/modules.d/nginx.yml
- module: nginx
access:
enabled: true
var.paths: ["/var/log/nginx/access.log*"]
error:
enabled: true
var.paths: ["/var/log/nginx/error.log*"]
ingress_controller:
enabled: false
MySQL modülü için:
# /etc/filebeat/modules.d/mysql.yml
- module: mysql
error:
enabled: true
var.paths: ["/var/log/mysql/error.log*"]
slowlog:
enabled: true
var.paths: ["/var/log/mysql/mysql-slow.log*"]
Modülleri kurup hazır template ve dashboard’ları yükleyelim:
# Index template ve ILM policy'yi Elasticsearch'e yükle
sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["https://elasticsearch-host:9200"]' -E 'output.elasticsearch.username=elastic' -E 'output.elasticsearch.password=sifreniz'
# Kibana dashboard'larını yükle
sudo filebeat setup --dashboards -E 'setup.kibana.host=https://kibana-host:5601'
Index Lifecycle Management (ILM) Konfigürasyonu
Production ortamında log’ların ne kadar tutulacağını ve ne zaman silineceğini yönetmek kritik. ILM ile bu otomatikleştirilebilir:
# Özel ILM policy oluştur
curl -X PUT "https://elasticsearch-host:9200/_ilm/policy/filebeat-policy"
-u elastic:sifreniz
-H "Content-Type: application/json"
-d '{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_size": "50gb",
"max_age": "1d"
},
"set_priority": {
"priority": 100
}
}
},
"warm": {
"min_age": "3d",
"actions": {
"shrink": {
"number_of_shards": 1
},
"forcemerge": {
"max_num_segments": 1
},
"set_priority": {
"priority": 50
}
}
},
"cold": {
"min_age": "30d",
"actions": {
"freeze": {}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}'
Bu policy ile şu akış sağlanıyor:
- Hot phase: Aktif yazma, 50GB veya 1 günden büyük olunca rollover
- Warm phase: 3 günden sonra tek shard’a küçültülür, optimize edilir
- Cold phase: 30 günden sonra dondurulur, arama yapılabilir ama yazma yapılamaz
- Delete phase: 90 günden sonra otomatik silinir
Processor Kullanımı ile Log Zenginleştirme
Filebeat’in processor’ları, log’ları Elasticsearch’e göndermeden önce işleme imkanı tanır:
# filebeat.yml içinde processors bölümü
processors:
# IP adresi üzerinden coğrafi konum bilgisi ekle
- add_locale: ~
# Gereksiz alanları kaldır (disk tasarrufu)
- drop_fields:
fields: ["agent.ephemeral_id", "ecs.version"]
ignore_missing: true
# Belirli pattern içeren logları filtrele (gürültüyü azalt)
- drop_event:
when:
regexp:
message: "^(GET /health|GET /ping|OPTIONS)"
# Log seviyesine göre etiket ekle
- add_tags:
tags: ["critical"]
when:
regexp:
message: "(FATAL|ERROR|CRITICAL)"
# Hostname'i normalize et
- add_host_metadata:
when.not.contains.tags: forwarded
# Hassas verileri maskele
- replace:
fields:
- field: "message"
pattern: 'bd{16}b'
replacement: "****-****-****-****"
ignore_missing: true
Performans Optimizasyonu
Yüksek trafikli sunucularda Filebeat’in performansını artırmak için şu ayarları deneyin:
# filebeat.yml - Performans ayarları
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/hightraffic/*.log
# Bir seferde okunacak satır sayısı
harvester_buffer_size: 16384
# Büyük log dosyaları için
max_bytes: 10485760
# Queue ayarları - bellek içi buffer
queue.mem:
events: 8192
flush.min_events: 4096
flush.timeout: 5s
# Output worker sayısı
output.elasticsearch:
hosts: ["https://es-node-1:9200", "https://es-node-2:9200", "https://es-node-3:9200"]
worker: 4
bulk_max_size: 1024
compression_level: 3
timeout: 90
# Kaç dosya aynı anda izlenecek
filebeat.registry.flush: 1s
Bir de şunu unutmayın: Filebeat’in kendi log’larını izlemeyin. Döngüsel log takibi ciddi sorunlara yol açar.
Güvenlik Konfigürasyonu ve TLS
Production ortamında her şey TLS üzerinden gitmelidir:
# Elasticsearch CA sertifikasını kopyala
sudo mkdir -p /etc/filebeat/certs
sudo cp /etc/elasticsearch/certs/http_ca.crt /etc/filebeat/certs/
# Filebeat'in sertifikaya erişebildiğinden emin ol
sudo chmod 640 /etc/filebeat/certs/http_ca.crt
sudo chown root:filebeat /etc/filebeat/certs/http_ca.crt
# filebeat.yml - Güvenlik bölümü
output.elasticsearch:
hosts: ["https://elasticsearch-host:9200"]
# API Key ile kimlik doğrulama (password yerine önerilir)
api_key: "id:api_key_value"
# Veya kullanıcı adı/şifre
# username: "filebeat_user"
# password: "guclu-sifre"
ssl.enabled: true
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
ssl.verification_mode: full
Elasticsearch’te Filebeat için ayrı bir kullanıcı oluşturmak iyi bir practice:
# Filebeat için rol oluştur
curl -X POST "https://elasticsearch-host:9200/_security/role/filebeat_writer"
-u elastic:sifreniz
-H "Content-Type: application/json"
-d '{
"cluster": ["monitor", "manage_index_templates", "manage_ilm"],
"indices": [
{
"names": ["filebeat-*"],
"privileges": ["write", "create_index", "manage"]
}
]
}'
# Kullanıcı oluştur
curl -X POST "https://elasticsearch-host:9200/_security/user/filebeat_user"
-u elastic:sifreniz
-H "Content-Type: application/json"
-d '{
"password": "guclu-filebeat-sifresi",
"roles": ["filebeat_writer"],
"full_name": "Filebeat Service User"
}'
Sorun Giderme
Karşılaşılan yaygın sorunları ve çözümlerini gözden geçirelim.
Filebeat’in başlamadığı durumlarda önce konfigürasyonu test edin:
# Konfigürasyon dosyasını doğrula
sudo filebeat test config -c /etc/filebeat/filebeat.yml
# Elasticsearch bağlantısını test et
sudo filebeat test output -c /etc/filebeat/filebeat.yml
# Servis loglarını incele
sudo journalctl -u filebeat -f
# Filebeat'in kendi log dosyasına bak
sudo tail -f /var/log/filebeat/filebeat
Registry bozulduğunda veya logları baştan okumak istediğinizde:
# Servisi durdur
sudo systemctl stop filebeat
# Registry dosyasını sil (loglar baştan okunur!)
sudo rm -rf /var/lib/filebeat/registry
# Servisi başlat
sudo systemctl start filebeat
Dikkat: Registry silme işlemi logların tekrar işlenmesine neden olur. Elasticsearch’te duplicate veriler oluşabilir. Bunu sadece test ortamında veya zorunlu durumlarda yapın.
İzin sorunları çok sık karşılaşılan bir durum:
# Filebeat'in log dosyalarını okuyabildiğini kontrol et
sudo -u filebeat cat /var/log/nginx/access.log
# Gerekirse ACL ile izin ver
sudo setfacl -m u:filebeat:r /var/log/nginx/access.log
sudo setfacl -d -m u:filebeat:r /var/log/nginx/
# Ya da filebeat kullanıcısını adm grubuna ekle
sudo usermod -aG adm filebeat
Gerçek Dünya Senaryosu: Microservice Ortamı
Diyelim ki 5 farklı microservice çalıştırıyorsunuz ve her birinin loglarını ayrı index’lerde toplamak istiyorsunuz. Her servis için ayrı Filebeat konfigürasyonu yazmak yerine, tek bir konfigürasyonda tümünü yönetebilirsiniz:
filebeat.inputs:
- type: log
enabled: true
paths: ["/var/log/user-service/*.log"]
fields:
service: user-service
team: backend
fields_under_root: true
json.keys_under_root: true
json.overwrite_keys: true
json.message_key: message
- type: log
enabled: true
paths: ["/var/log/payment-service/*.log"]
fields:
service: payment-service
team: fintech
fields_under_root: true
json.keys_under_root: true
json.overwrite_keys: true
# Ödeme logları için hassas veri maskeleme
- type: log
enabled: true
paths: ["/var/log/notification-service/*.log"]
fields:
service: notification-service
team: backend
fields_under_root: true
output.elasticsearch:
hosts: ["https://elasticsearch-host:9200"]
username: "filebeat_user"
password: "sifre"
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
# Servis adına göre dinamik index
index: "microservices-%{[service]}-%{+yyyy.MM.dd}"
setup.template.name: "microservices"
setup.template.pattern: "microservices-*"
setup.ilm.enabled: false
Bu yaklaşımla her microservice kendi index’ine yazıyor, Kibana’da da servis bazlı arama ve dashboard oluşturmak kolaylaşıyor.
Filebeat Servisini Yönetme
# Servisi başlat ve boot'ta otomatik başlamasını sağla
sudo systemctl enable --now filebeat
# Konfigürasyon değişikliği sonrası yeniden yükle
sudo systemctl reload filebeat
# Filebeat'in kaç event gönderdiğini izle
sudo filebeat export template | head -50
# İstatistikleri görüntüle (HTTP monitoring açıksa)
curl http://localhost:5066/stats | python3 -m json.tool
Monitoring endpoint’ini açmak için filebeat.yml‘e şunu ekleyin:
http.enabled: true
http.port: 5066
http.host: "127.0.0.1"
Ardından Grafana veya benzeri bir araçla bu metrics’leri takip edebilirsiniz. Özellikle filebeat.events.active ve filebeat.harvester.open_files değerleri sistem sağlığı hakkında önemli sinyaller verir.
Sonuç
Filebeat, doğru konfigüre edildiğinde log yönetimini gerçekten sınıflandırır. Hafif yapısı sayesinde production sunucularına minimum yük bindirirken, güvenilir delivery mekanizması log kaybetme riskini ortadan kaldırır.
Bu yazıda incelediğimiz konuları özetlersek:
- Temel kurulum ve konfigürasyon hem Debian hem RPM tabanlı sistemler için ele alındı
- Multiline log desteğiyle Java gibi framework’lerin ürettiği karmaşık loglar tek event olarak işlenebilir
- Hazır modüller sayesinde Nginx, MySQL gibi uygulamalar için sıfırdan parser yazmaya gerek yok
- ILM ile log’ların yaşam döngüsünü otomatize etmek disk yönetimini büyük ölçüde kolaylaştırıyor
- Güvenlik için dedicated kullanıcı ve TLS kullanımı production’da zorunlu olarak kabul edilmeli
- Processor’lar ile hassas verileri maskelemek GDPR ve benzeri uyumluluk gereksinimleri için hayat kurtarıcı
En çok önerdiğim yaklaşım şu: Önce tek bir sunucuda küçük ölçekte test edin, performans ve doğruluk açısından tatmin olduktan sonra diğer sunuculara yayın. Ansible veya Chef gibi bir konfigürasyon yönetim aracıyla Filebeat konfigürasyonunu merkezi olarak yönetmek, büyük cluster’larda operasyonel yükü dramatik biçimde düşürür.
