Filebeat ile Sunucu Loglarını Elasticsearch’e Gönderme
Üretim ortamında log yönetimi, genellikle “sonra hallederiz” listesinin başında yer alır. Ta ki bir şeyler patlayana kadar. O anda SSH ile 5 farklı sunucuya bağlanıp tail -f çekmeye çalışırken kendinizi bulursunuz. Filebeat ve Elasticsearch ikilisi tam da bu sorunu çözmek için var; logları merkezi bir noktada toplamak, aramak ve analiz etmek. Bu yazıda sıfırdan kurulumu, gerçek senaryoları ve dikkat edilmesi gereken noktaları ele alacağız.
ELK Stack’te Filebeat’in Rolü
Elasticsearch, Logstash ve Kibana üçlüsüne genellikle ELK Stack denir. Filebeat ise bu üçlünün “hafif” veri taşıyıcısı konumunda. Logstash güçlü ama ağır bir araç; her sunucuya kurmak istemezsiniz. Filebeat ise düşük kaynak tüketimiyle çalışan, Go ile yazılmış bir log shipper. Temel işlevi şu: belirlediğiniz dosyaları takip et, yeni satır geldiğinde onu al, hedefe gönder.
Mimarimiz şöyle işleyecek: Sunucularda Filebeat çalışır, logları okur ve doğrudan Elasticsearch’e ya da arada Logstash’e gönderir. Biz bu yazıda doğrudan Elasticsearch’e gönderme senaryosunu işleyeceğiz çünkü çoğu ortam için bu yeterince sağlam ve daha az karmaşık.
Kurulum Öncesi Hazırlık
Önce ortamı netleştirelim. Varsayımlar:
- Elasticsearch 8.x çalışıyor, diyelim ki
192.168.1.100:9200adresinde - Log göndereceğimiz sunucu Ubuntu 22.04 veya RHEL/CentOS 8+
- Elasticsearch’te security (TLS + authentication) açık
Bu son madde önemli. Elasticsearch 8.x’te güvenlik varsayılan olarak açık geliyor. Kapalı bırakmak, özellikle production’da ciddi bir güvenlik açığı demek.
Elasticsearch’te Kullanıcı Oluşturma
Filebeat’in Elasticsearch’e bağlanabilmesi için bir kullanıcıya ihtiyacı var. En iyi pratik, minimum yetkiyle bir servis kullanıcısı oluşturmak.
# Elasticsearch'te filebeat için rol tanımla
curl -X POST "https://192.168.1.100:9200/_security/role/filebeat_writer"
-H "Content-Type: application/json"
-u elastic:SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"cluster": ["monitor", "manage_ilm", "manage_index_templates"],
"indices": [
{
"names": ["filebeat-*", "logs-*"],
"privileges": ["write", "create_index", "view_index_metadata"]
}
]
}'
# Kullanıcı oluştur
curl -X POST "https://192.168.1.100:9200/_security/user/filebeat_user"
-H "Content-Type: application/json"
-u elastic:SIFRENIZ
--cacert /etc/elasticsearch/certs/http_ca.crt
-d '{
"password": "guclu_bir_sifre",
"roles": ["filebeat_writer"],
"full_name": "Filebeat Service User"
}'
Filebeat Kurulumu
Debian/Ubuntu üzerinde
# Elastic GPG anahtarını ekle
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
# Repo 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
# Kur
sudo apt update && sudo apt install filebeat -y
# Servisi etkinleştir ama henüz başlatma
sudo systemctl enable filebeat
RHEL/CentOS/Rocky Linux üzerinde
# Repo dosyası 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
sudo dnf install filebeat -y
sudo systemctl enable filebeat
Filebeat Yapılandırması
Ana yapılandırma dosyası /etc/filebeat/filebeat.yml. Bu dosyayı sıfırdan anlamak için orijinalini yedekleyip temiz bir başlangıç yapıyorum genellikle:
sudo cp /etc/filebeat/filebeat.yml /etc/filebeat/filebeat.yml.orig
Temel Yapılandırma
Basit bir senaryo: Nginx access ve error loglarını gönderelim.
# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: filestream
id: nginx-access
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
environment: production
server_name: web01
fields_under_root: true
- type: filestream
id: nginx-error
enabled: true
paths:
- /var/log/nginx/error.log
fields:
log_type: nginx_error
environment: production
server_name: web01
fields_under_root: true
- type: filestream
id: syslog
enabled: true
paths:
- /var/log/syslog
- /var/log/auth.log
fields:
log_type: system
environment: production
server_name: web01
fields_under_root: true
# Processors: Gereksiz alanları temizle, log zenginleştir
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_docker_metadata: ~
- drop_fields:
fields: ["agent.ephemeral_id", "ecs.version"]
ignore_missing: true
# Elasticsearch output
output.elasticsearch:
hosts: ["https://192.168.1.100:9200"]
username: "filebeat_user"
password: "guclu_bir_sifre"
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
index: "filebeat-%{[fields.server_name]}-%{+yyyy.MM.dd}"
# Kibana bağlantısı (dashboard setup için)
setup.kibana:
host: "https://192.168.1.101:5601"
username: "elastic"
password: "SIFRENIZ"
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
# ILM (Index Lifecycle Management) ayarları
setup.ilm.enabled: true
setup.ilm.rollover_alias: "filebeat"
setup.ilm.pattern: "{now/d}-000001"
# Logging
logging.level: warning
logging.to_files: true
logging.files:
path: /var/log/filebeat
name: filebeat
keepfiles: 7
permissions: 0640
Elasticsearch CA sertifikasını sunucuya kopyalamayı unutmayın:
sudo mkdir -p /etc/filebeat/certs
# Elasticsearch sunucusundan kopyala
scp [email protected]:/etc/elasticsearch/certs/http_ca.crt /etc/filebeat/certs/
sudo chown root:root /etc/filebeat/certs/http_ca.crt
sudo chmod 644 /etc/filebeat/certs/http_ca.crt
Modül Sistemi ile Hızlı Kurulum
Filebeat’in güzel taraflarından biri de modül sistemi. Nginx, Apache, MySQL, PostgreSQL, sistem logları gibi yaygın uygulamalar için önceden tanımlanmış yapılandırmalar geliyor. Bunlar sadece yapılandırma şablonu değil; aynı zamanda Kibana dashboardları ve Elasticsearch ingest pipeline’ları da içeriyor.
# Mevcut modülleri listele
sudo filebeat modules list
# Nginx modülünü etkinleştir
sudo filebeat modules enable nginx
# System modülünü etkinleştir
sudo filebeat modules enable system
# MySQL modülünü etkinleştir
sudo filebeat modules enable mysql
Nginx modülü yapılandırması /etc/filebeat/modules.d/nginx.yml:
- module: nginx
access:
enabled: true
var.paths: ["/var/log/nginx/access.log*"]
# Özel log formatı kullanıyorsanız:
# var.pipeline: with_plugins
error:
enabled: true
var.paths: ["/var/log/nginx/error.log*"]
Modülleri etkinleştirdikten sonra setup komutunu çalıştırın; bu Kibana’ya dashboardları, Elasticsearch’e index template’lerini yükler:
sudo filebeat setup --dashboards --index-management
Multiline Log Desteği
Java stack trace veya Python traceback gibi çok satırlı loglar için multiline yapılandırması şart. Aksi halde her satır ayrı bir log eventi olarak gelir ve anlam ifade etmez.
filebeat.inputs:
- type: filestream
id: java-app
enabled: true
paths:
- /var/log/myapp/application.log
parsers:
- multiline:
type: pattern
pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
negate: true
match: after
max_lines: 500
timeout: 5s
fields:
log_type: java_application
app_name: myapp
fields_under_root: true
Buradaki mantık şu: Her log satırı tarih damgasıyla başlar (^[0-9]{4}-[0-9]{2}-[0-9]{2}). Bu pattern’e uymayan satırlar bir önceki satıra eklenir. negate: true ile “pattern’e uymayan” demek istiyoruz, match: after ile de bu satırları bir öncekine ekle diyoruz.
Güvenlik Sıkılaştırması ve Parola Yönetimi
YAML dosyasına açık parola yazmak iyi bir pratik değil. Filebeat’in keystore özelliğini kullanın:
# Keystore oluştur
sudo filebeat keystore create
# Elasticsearch şifresini ekle
sudo filebeat keystore add ES_PASSWORD
# Kibana şifresini ekle
sudo filebeat keystore add KIBANA_PASSWORD
# Mevcut anahtarları listele
sudo filebeat keystore list
Artık filebeat.yml dosyasında şifre yerine değişken referansı kullanabilirsiniz:
output.elasticsearch:
hosts: ["https://192.168.1.100:9200"]
username: "filebeat_user"
password: "${ES_PASSWORD}"
setup.kibana:
password: "${KIBANA_PASSWORD}"
Performans Ayarları ve Queue Yapılandırması
Yoğun log üreten sistemlerde varsayılan ayarlar yetersiz kalabilir. Filebeat’in iç kuyruğunu ve batch boyutunu ayarlamak gerekebilir:
# filebeat.yml içine ekle
# Memory queue ayarları
queue.mem:
events: 4096
flush.min_events: 512
flush.timeout: 5s
# Output worker ve batch ayarları
output.elasticsearch:
hosts: ["https://192.168.1.100:9200"]
username: "filebeat_user"
password: "${ES_PASSWORD}"
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
worker: 4
bulk_max_size: 1024
compression_level: 3
timeout: 90
max_retries: 3
worker: Elasticsearch’e paralel bağlantı sayısı. Tek Elasticsearch node için 2-4 yeterli.
bulk_max_size: Tek bir bulk request’te gönderilecek maksimum event sayısı. Büyük değerler throughput artırır ama bellek kullanımını da artırır.
compression_level: 0 ile 9 arasında. Network bant genişliği kısıtlıysa 3-5 arası iyi bir denge noktası.
Gerçek Dünya Senaryosu: Çok Sunuculu Ortam
Diyelim ki 20 web sunucunuz var ve hepsinden log topluyorsunuz. Her sunucuda aynı Filebeat yapılandırmasını kurmak yerine, Ansible ile dağıtım yapıyoruz. Yapılandırma şablonu olarak kullanabileceğiniz bir örnek:
# filebeat.yml.j2 (Ansible Jinja2 template)
filebeat.inputs:
- type: filestream
id: nginx-{{ inventory_hostname }}
enabled: true
paths:
- /var/log/nginx/access.log
- /var/log/nginx/error.log
fields:
log_type: nginx
environment: "{{ env }}"
server_name: "{{ inventory_hostname }}"
datacenter: "{{ datacenter | default('main') }}"
server_role: "{{ server_role | default('web') }}"
fields_under_root: true
processors:
- add_host_metadata: ~
- drop_event:
when:
contains:
message: "health_check"
output.elasticsearch:
hosts: ["https://{{ elasticsearch_host }}:9200"]
username: "filebeat_user"
password: "${ES_PASSWORD}"
ssl.certificate_authorities: ["/etc/filebeat/certs/http_ca.crt"]
index: "logs-nginx-%{[environment]}-%{+yyyy.MM}"
drop_event processor’ına dikkat edin. Health check logları genellikle anlamlı değil ama binlerce satır üretiyor. Bunları Filebeat tarafında düşürmek, Elasticsearch’e gereksiz veri göndermemek ve depolama maliyetini azaltmak açısından önemli.
Filebeat Durumunu İzleme ve Sorun Giderme
Filebeat çalışıyor mu, gerçekten log gönderiyor mu? Önce servis durumunu kontrol edin:
# Servis durumu
sudo systemctl status filebeat
# Canlı log takibi
sudo journalctl -u filebeat -f
# Filebeat'in kendi log dosyası
sudo tail -f /var/log/filebeat/filebeat
# Filebeat istatistikleri (HTTP endpoint)
# filebeat.yml'a şunu ekleyin:
# http.enabled: true
# http.port: 5066
curl http://localhost:5066/stats | python3 -m json.tool | grep -E '"events"|"bytes"'
En sık karşılaşılan sorunlar ve çözümleri:
Bağlantı hatası alıyorsanız:
# Bağlantıyı test et
curl -u filebeat_user:SIFRE
--cacert /etc/filebeat/certs/http_ca.crt
https://192.168.1.100:9200/_cluster/health
# Filebeat yapılandırmasını test et
sudo filebeat test config -c /etc/filebeat/filebeat.yml
# Output bağlantısını test et
sudo filebeat test output -c /etc/filebeat/filebeat.yml
Log dosyası okunmuyorsa:
Filebeat filebeat kullanıcısı altında çalışır. Log dosyalarının izinlerini kontrol edin:
# Nginx log dosyaları genellikle www-data veya nginx kullanıcısına ait
ls -la /var/log/nginx/
# Filebeat kullanıcısını adm grubuna ekle (Ubuntu'da log grupları için)
sudo usermod -aG adm filebeat
sudo systemctl restart filebeat
Registry dosyası: Filebeat hangi dosyada nereye kadar okuduğunu bir registry’de tutar. Bazen bu registry bozulabilir ya da sıfırdan başlamak isteyebilirsiniz:
# Registry konumu (Ubuntu)
ls -la /var/lib/filebeat/registry/
# Sıfırdan başlatmak için (DİKKAT: tüm logları yeniden gönderir)
sudo systemctl stop filebeat
sudo rm -rf /var/lib/filebeat/registry/
sudo systemctl start filebeat
Index Lifecycle Management (ILM) ile Log Rotasyonu
Elasticsearch’te loglar birikiyor, disk doluyor. ILM ile bu süreci otomatize edin. Filebeat ILM policy’sini otomatik oluşturabilir ama özelleştirmenizi öneririm:
curl -X PUT "https://192.168.1.100:9200/_ilm/policy/filebeat-policy"
-H "Content-Type: application/json"
-u elastic:SIFRENIZ
--cacert /etc/filebeat/certs/http_ca.crt
-d '{
"policy": {
"phases": {
"hot": {
"min_age": "0ms",
"actions": {
"rollover": {
"max_primary_shard_size": "50gb",
"max_age": "7d"
}
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": { "number_of_shards": 1 },
"forcemerge": { "max_num_segments": 1 }
}
},
"cold": {
"min_age": "30d",
"actions": {
"freeze": {}
}
},
"delete": {
"min_age": "90d",
"actions": {
"delete": {}
}
}
}
}
}'
Bu policy ile loglar 7 gün hot’ta kalır, 30 güne kadar warm’da, 90 güne kadar cold’da, sonra silinir. Saklama sürenizi compliance gereksinimlerinize göre ayarlayın.
Sonuç
Filebeat kurulumu kağıt üzerinde basit görünür ama production’da dikkat edilmesi gereken onlarca detay var. Güvenlik konfigürasyonu, doğru index stratejisi, multiline log desteği, ILM politikaları, kaynak yönetimi… Bunların hepsini baştan doğru yapmak sonradan “neden bu loglar gelmiyor?” veya “disk neden doldu?” gibi sorularla zaman kaybetmenizi önler.
Önerilen sıralama şöyle: Önce güvenliği doğru kur (TLS + ayrı servis kullanıcısı), sonra basit bir yapılandırmayla test et, işe yarıyor mu doğrula, sonra üretime al ve ILM ile yönetimi otomatize et. Log yönetimini “sonra” bırakmayın; bir şeyler patladığında log aramak yerine log analiz etmek istiyorsunuz.
