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:9200 adresinde
  • 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir