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.

Bir yanıt yazın

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