Takip et

Logstash Filtreleri ile Merkezi Loglamayı İyileştirmek (Logstash Forwarder Kullanımı)

Logstash Filtreleri ile Merkezi Loglamayı İyileştirmek (Logstash Forwarder Kullanımı) Giriş: Merkezi Loglamanın Önemi ve Logstash’in Rolü

Logstash Filtreleri ile Merkezi Loglamayı İyileştirmek (Logstash Forwarder Kullanımı)

Giriş: Merkezi Loglamanın Önemi ve Logstash’in Rolü

Günümüzün karmaşık bilgi işlem ortamlarında, uygulamalar, sunucular, ağ cihazları ve diğer altyapı bileşenleri sürekli olarak log (günlük) verileri üretir. Bu loglar, sistemlerin durumu, performansı, güvenlik olayları ve hata ayıklama için kritik bilgiler içerir. Ancak, bu logların farklı formatlarda, farklı konumlarda ve yüksek hacimlerde üretilmesi, manuel olarak incelenmesini neredeyse imkansız hale getirir. İşte bu noktada merkezi loglama devreye girer. Merkezi loglama, tüm bu dağınık logları tek bir merkezi konuma toplayarak, kolayca aranabilir, analiz edilebilir ve görselleştirilebilir hale getirir.

Merkezi loglama sistemlerinin en popüler bileşenlerinden biri olan ELK Stack (Elasticsearch, Logstash, Kibana), bu ihtiyaca güçlü bir çözüm sunar. Elasticsearch, log verilerini depolayan ve indeksleyen dağıtık bir arama motorudur; Kibana, Elasticsearch’teki verileri görselleştirmek ve analiz etmek için kullanılan bir kullanıcı arayüzüdür. Bu makalenin odak noktası olan Logstash ise, log verilerini toplama, işleme ve zenginleştirme görevini üstlenen güçlü bir veri işleme aracıdır. Logstash, farklı kaynaklardan gelen ham logları alıp, bunları anlamlı ve yapılandırılmış verilere dönüştürerek Elasticsearch’e göndermeden önce önemli bir dönüşüm katmanı sağlar. Bu dönüşüm süreci, “filtreler” aracılığıyla gerçekleştirilir.

Başlangıçta “Logstash Forwarder” adı verilen hafif bir ajan, logları doğrudan sunuculardan Logstash’e göndermek için kullanılıyordu. Zamanla, bu rolü daha verimli ve özellik dolu olan “Beats” ailesi, özellikle de “Filebeat” devraldı. Ancak, temeldeki prensip aynı kalmıştır: uzak sunuculardan logları güvenli ve verimli bir şekilde Logstash’e aktarmak. Bu makalede, Logstash’in filtreleme yeteneklerinin, merkezi loglama sistemlerinin etkinliğini nasıl artırdığını ve log verilerini analiz için nasıl daha değerli hale getirdiğini detaylı bir şekilde inceleyeceğiz.

Logstash Forwarder (Beats) ve Veri Akışı

Merkezi loglama mimarisinin temel taşlarından biri, logları üreten kaynaklardan Logstash sunucusuna güvenli ve verimli bir şekilde aktarmaktır. Tarihsel olarak, bu görev için “Logstash Forwarder” (daha sonra Lumberjack olarak da bilinen) adı verilen hafif bir ajan kullanılıyordu. Bu ajan, log dosyalarını izler, yeni satırları okur ve bunları TLS/SSL şifrelemesi kullanarak Logstash’e gönderirdi. Günümüzde ise bu rolü, Elastic’in “Beats” ailesi, özellikle de “Filebeat” üstlenmiştir. Filebeat, Logstash Forwarder’ın modern ve geliştirilmiş bir alternatifidir; daha az kaynak tüketir, daha esnektir ve hata toleransı daha yüksektir. Makalemizin başlığında “Logstash Forwarder” belirtilse de, güncel uygulamalarda Filebeat’in kullanıldığını belirtmek ve bu bağlamda değerlendirme yapmak önemlidir. Ancak, her iki durumda da prensip aynıdır: logları toplar ve Logstash’e iletirler.

Basit bir veri akışı senaryosunda süreç şu şekildedir:

1. Log Üretimi: Bir web sunucusu (örn. Apache, Nginx), uygulama sunucusu veya işletim sistemi, log dosyalarına sürekli olarak bilgi yazar.
2. Veri Toplama (Filebeat/Logstash Forwarder): Sunucu üzerinde çalışan Filebeat (veya eski Logstash Forwarder), belirli log dosyalarını (örn. /var/log/apache2/access.log) izler. Yeni satırlar eklendiğinde, bunları okur ve bir olay (event) olarak paketler.
3. Güvenli İletim: Filebeat, bu olayları TLS/SSL şifrelemesi kullanarak Logstash sunucusuna gönderir. Bu, verilerin ağ üzerinde güvenli bir şekilde aktarılmasını sağlar.
4. Logstash Girişi (Input): Logstash sunucusunda, bir “input” eklentisi (genellikle beats input eklentisi), Filebeat’ten gelen bağlantıları dinler ve gelen olayları kabul eder.
5. Logstash Filtreleme (Filter): Gelen ham log olayları, Logstash’in “filter” aşamasına girer. Bu aşamada, loglar ayrıştırılır, zenginleştirilir, dönüştürülür ve yapılandırılır. Bu makalenin ana odak noktası burasıdır.
6. Logstash Çıkışı (Output): İşlenmiş ve yapılandırılmış log olayları, Logstash’in “output” aşamasına geçer. Genellikle bu aşamada, veriler Elasticsearch’e gönderilir. Ancak, Kafka, Redis, S3 gibi farklı hedeflere de gönderilebilir.
7. Depolama ve Analiz: Elasticsearch, gelen yapılandırılmış logları indeksler ve depolar. Kibana aracılığıyla bu veriler sorgulanabilir, analiz edilebilir ve görselleştirilebilir.

Bu akışta, Logstash’in filtre aşaması, ham ve genellikle okunaksız log verilerini, analize uygun, tutarlı ve değerli bilgilere dönüştüren kritik bir köprü görevi görür. Filtreler olmadan, Elasticsearch’te depolanan veriler büyük ölçüde ham ve kullanışsız kalacaktır.

Logstash Filtrelerinin Gücü ve Neden İhtiyaç Duyulur?

Ham log verileri genellikle yapılandırılmamış metinlerdir. Bir Apache erişim logu satırı şöyle görünebilir:

192.168.1.1 - - [10/Nov/2023:14:30:01 +0300] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0"

Bu satır, insan gözüyle okunduğunda bazı bilgiler içerse de, bir makine tarafından doğrudan analiz edilmesi zordur. Belirli alanları (IP adresi, zaman damgası, HTTP metodu, URL, durum kodu, boyut) çıkarmak, bunları ayrı alanlar olarak etiketlemek ve veri tiplerini dönüştürmek gerekir. Aksi takdirde, Elasticsearch’te bu veriler üzerinde “kaynak IP’ye göre trafik dağılımını göster” veya “son 5 dakikada 5xx durum kodu dönen URL’leri listele” gibi karmaşık sorgular çalıştıramazsınız.

Logstash filtrelerinin temel amacı, bu ham log verilerini alıp şunları yapmaktır:

1. Yapılandırma (Parsing): Ham metin loglarını, anahtar-değer çiftleri veya JSON nesneleri gibi yapılandırılmış verilere dönüştürmek. Bu, loglardaki belirli bilgileri (örn. IP adresi, kullanıcı adı, hata kodu) ayrı alanlar olarak çıkarmayı içerir.
2. Normalleştirme: Farklı log kaynaklarından gelen benzer bilgileri (örn. zaman damgası, seviye) tutarlı bir format ve alan adı altında birleştirmek. Bu, farklı sistemlerden gelen logların birlikte analiz edilmesini kolaylaştırır.
3. Zenginleştirme (Enrichment): Log verilerine ek bilgiler eklemek. Örneğin, bir IP adresinden coğrafi konum bilgisi (ülke, şehir) eklemek veya bir hata koduna açıklayıcı bir metin eklemek.
4. Dönüştürme ve Temizleme: Alanların veri tiplerini değiştirmek (örn. metni sayıya dönüştürmek), gereksiz alanları kaldırmak, hassas bilgileri maskelemek veya alan adlarını yeniden adlandırmak.
5. Koşullu İşleme: Belirli kriterlere uyan logları farklı şekillerde işlemek veya tamamen atmak.

Bu işlemler olmadan, merkezi loglama sisteminiz bir “veri çöplüğüne” dönüşebilir. Filtreler, log verilerinizin kalitesini, kullanılabilirliğini ve analitik değerini doğrudan artırır. Ayrıca, gereksiz verileri atarak veya özetleyerek depolama maliyetlerini düşürmeye ve Elasticsearch’teki indeksleme performansını optimize etmeye yardımcı olurlar.

Temel Logstash Filtreleri ve Kullanım Senaryoları

Logstash, çok çeşitli filtre eklentileri sunar. İşte en yaygın ve güçlü olanlardan bazıları:

grok Filtresi: Yapılandırılmamış Veriyi Yapılandırmak

grok filtresi, Logstash’in en güçlü ve en sık kullanılan filtrelerinden biridir. Yapılandırılmamış metin loglarını, önceden tanımlanmış veya özel olarak oluşturulmuş düzenli ifade (regex) desenleri kullanarak yapılandırılmış alanlara dönüştürür. Logstash, Apache, Nginx, Syslog gibi yaygın log formatları için yüzlerce hazır grok deseniyle birlikte gelir.

Kullanım Senaryosu: Web sunucusu erişim logları, sistem logları, özel uygulama logları.

Örnek Yapılandırma (Apache Erişim Logu):

filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
}

Bu örnekte, message alanındaki log satırı, Logstash’in dahili COMBINEDAPACHELOG deseniyle eşleştirilir. Bu desen, log satırını otomatik olarak clientip, ident, auth, timestamp, verb, request, httpversion, response, bytes, referrer, agent gibi alanlara ayırır.

Özel Grok Deseni: Eğer hazır desenler log formatınıza uymuyorsa, kendi desenlerinizi tanımlayabilirsiniz.

filter {
  grok {
    match => { "message" => "(?\w+): %{GREEDYDATA:log_message}" }
  }
}

Bu örnek, INFO: Bu bir mesajdır. gibi bir log satırını log_level ve log_message alanlarına ayırır. (?desen) sözdizimi, yakalanan grubun adını belirler.

date Filtresi: Zaman Damgalarını Doğru Yönetmek

Logların doğru zaman damgasına sahip olması, olayları kronolojik sıraya koymak, zaman aralığına göre arama yapmak ve korelasyon analizi yapmak için hayati öneme sahiptir. date filtresi, log olaylarındaki metin tabanlı zaman damgalarını ayrıştırır ve Logstash’in dahili @timestamp alanına atar. Bu alan, Elasticsearch’te zaman bazlı indeksleme ve sorgulama için kullanılır.

Kullanım Senaryosu: Neredeyse tüm log türleri için gereklidir.

Örnek Yapılandırma:

filter {
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"
  }
}

Bu örnek, timestamp adlı bir alandaki 10/Nov/2023:14:30:01 +0300 formatındaki zaman damgasını ayrıştırır ve @timestamp alanına atar. match parametresi birden fazla format alabilir, böylece farklı kaynaklardan gelen farklı zaman damgası formatlarını işleyebilirsiniz.

mutate Filtresi: Alanları Manipüle Etmek

mutate filtresi, mevcut alanları değiştirmek, yeni alanlar eklemek, alanları yeniden adlandırmak, kaldırmak veya veri tiplerini dönüştürmek için kullanılan çok yönlü bir filtredir.

Kullanım Senaryosu: Veri temizliği, normalleştirme, depolama optimizasyonu.

Örnek Yapılandırma:

filter {
  mutate {
    add_field => { "env" => "production" } # Yeni alan ekle
    remove_field => [ "some_unnecessary_field", "path" ] # Alanları kaldır
    rename => { "clientip" => "source_ip" } # Alanı yeniden adlandır
    convert => { "response" => "integer" } # Veri tipini dönüştür
    gsub => [ "message", "\s+", " " ] # Metin içinde değiştirme yap (regex)
  }
}

* add_field: Olaylara sabit bir değerle yeni bir alan ekler.
* remove_field: Belirtilen alanları olaydan kaldırır. Bu, depolama alanından tasarruf etmek için faydalıdır.
* rename: Bir alanın adını değiştirir.
* convert: Bir alanın veri tipini değiştirir (örn. string to integer, float, boolean).
* gsub: Bir alanın değerinde düzenli ifade kullanarak metin değiştirme işlemi yapar.

json Filtresi: JSON Verilerini Ayrıştırmak

Uygulamalar genellikle loglarını doğrudan JSON formatında üretirler. json filtresi, bir alandaki JSON dizesini ayrıştırarak, bu dizedeki her anahtar-değer çiftini olayın ayrı bir alanı haline getirir.

Kullanım Senaryosu: Yapılandırılmış uygulama logları, API logları.

Örnek Yapılandırma:

filter {
  json {
    source => "message"
    target => "json_data" # İsteğe bağlı, ayrıştırılan JSON'ı belirtilen bir alt alana koyar
  }
}

Eğer message alanı {"level": "info", "message": "User logged in", "user_id": 123} gibi bir JSON dizesi içeriyorsa, bu filtre, level, message ve user_id alanlarını doğrudan olayın kök seviyesine (veya target belirtilmişse json_data altına) ekler.

kv Filtresi: Anahtar-Değer Çiftlerini Ayrıştırmak

kv (key-value) filtresi, key=value key2="value with spaces" gibi anahtar-değer çiftleri içeren log satırlarını ayrıştırmak için kullanılır.

Kullanım Senaryosu: Güvenlik cihazı logları, özel uygulama logları, Windows olay logları.

Örnek Yapılandırma:

filter {
  kv {
    source => "message"
    field_split => "& " # Anahtar-değer çiftlerini ayıran karakterler
    value_split => "=" # Anahtar ve değeri ayıran karakter
  }
}

Bu, message alanındaki event=login user=john status=success gibi bir dizeden event, user, status alanlarını çıkarır.

geoip Filtresi: Coğrafi Bilgi Eklemek

geoip filtresi, bir IP adresini kullanarak coğrafi konum bilgilerini (ülke, şehir, enlem, boylam vb.) olaya ekler. Bu, logları harita üzerinde görselleştirmek veya coğrafi konuma göre analiz yapmak için çok değerlidir.

Kullanım Senaryosu: Web sunucusu erişim logları, güvenlik logları (saldırıların coğrafi kaynağını belirlemek), ağ trafiği analizi.

Örnek Yapılandırma:

filter {
  geoip {
    source => "clientip" # IP adresini içeren alan
  }
}

Bu, clientip alanındaki IP adresinden geoip adlı yeni bir alan oluşturur ve bu alana country_name, city_name, location (coğrafi koordinatlar) gibi bilgileri ekler.

drop Filtresi: İstenmeyen Logları Atmak

drop filtresi, belirli koşulları karşılayan log olaylarını tamamen siler. Bu, gereksiz gürültüyü azaltmak, depolama alanından tasarruf etmek ve sadece önemli loglara odaklanmak için kullanışlıdır.

Kullanım Senaryosu: Sağlık kontrolü logları, bilinen bot trafiği, çok sık tekrarlayan önemsiz hata mesajları.

Örnek Yapılandırma:

filter {
  if [message] =~ "HEALTHCHECK" {
    drop {}
  }
}

Bu örnek, message alanında “HEALTHCHECK” kelimesini içeren tüm log olaylarını Logstash pipeline’ından atar.

if Koşulları ve Filtre Zincirleri

Logstash filtreleri, if koşulları ile birlikte kullanıldığında çok daha güçlü hale gelir. Bu, farklı log türlerine veya belirli alan değerlerine göre farklı filtre setleri uygulamanızı sağlar.

Örnek Yapılandırma:

filter {
  if [type] == "apache_access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
    geoip {
      source => "clientip"
    }
  } else if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGBASE} %{SYSLOGPROG}: %{GREEDYDATA:syslog_message}" }
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  } else {
    # Diğer loglar için varsayılan işlem
    mutate {
      add_tag => [ "_grokparsefailure" ]
    }
  }
}

Bu örnekte, type alanına göre (genellikle Filebeat tarafından eklenir) farklı filtreler uygulanır. Bu sayede, Logstash aynı pipeline içinde farklı formatlardaki logları doğru bir şekilde işleyebilir. else bloğu, hiçbir koşula uymayan logları işaretlemek için kullanılabilir, bu da hata ayıklama sırasında yardımcı olur.

Logstash Filtre Yapılandırması ve En İyi Uygulamalar

Logstash’in yapılandırması, input, filter ve output bölümlerinden oluşur. Filtrelerin doğru bir şekilde sıralanması ve verimli bir şekilde kullanılması, Logstash pipeline’ının performansını ve log analizinin doğruluğunu doğrudan etkiler.

Logstash Pipeline Yapısı

Bir Logstash yapılandırma dosyası (genellikle .conf uzantılı), temel olarak üç ana bölümden oluşur:

* input: Logstash’in verileri nereden alacağını tanımlar (örn. beats, file, syslog, kafka).
* filter: Gelen verilerin nasıl işleneceğini, ayrıştırılacağını ve dönüştürüleceğini tanımlar. Bu makalenin ana odak noktasıdır.
* output: İşlenmiş verilerin nereye gönderileceğini tanımlar (örn. elasticsearch, stdout, file, kafka).

Örnek Basit Yapılandırma:

input {
  beats {
    port => 5044
  }
}

filter {
  # Filtreler buraya gelecek
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "my-app-logs-%{+YYYY.MM.dd}"
  }
  stdout { codec => rubydebug } # Hata ayıklama için
}

Filtrelerin Sıralaması: Performans ve Doğruluk

Filtreler, yapılandırma dosyasında göründükleri sıraya göre uygulanır. Bu sıralama kritik öneme sahiptir:

1. Ön Koşullar: Genellikle, bir sonraki filtrenin çalışması için belirli bir alanın var olması gerekiyorsa, bu alanı oluşturan filtre önce gelmelidir. Örneğin, grok filtresiyle bir IP adresi çıkarıldıktan sonra geoip filtresi uygulanmalıdır.
2. En Kapsamlıdan En Dar Kapsamlıya: Geniş kapsamlı desenler veya işlemler önce, daha spesifik olanlar sonra gelmelidir.
3. Performans: Kaynak yoğun filtreler (örn. karmaşık regex’ler içeren grok), mümkünse daha az log olayına uygulanacak şekilde if koşullarıyla sınırlandırılmalıdır. drop filtreleri, gereksiz logları pipeline’ın başlarında atmak için kullanılabilir, bu da sonraki filtrelerin daha az veri üzerinde çalışmasını sağlayarak performansı artırır.

if Koşulları ile Verimli Akış Kontrolü

Daha önce de belirtildiği gibi, if koşulları Logstash’in en güçlü özelliklerinden biridir. Farklı log kaynakları veya formatları için ayrı ayrı filtre blokları tanımlayarak, Logstash’in sadece ilgili filtreleri çalıştırmasını sağlarsınız. Bu, hem yapılandırmayı daha okunabilir hale getirir hem de gereksiz filtre işlemlerini önleyerek performansı artırır.

filter {
  if [fields][log_type] == "apache_access" {
    # Apache logları için filtreler
  } else if [fields][log_type] == "nginx_error" {
    # Nginx hata logları için filtreler
  } else {
    # Hiçbirine uymayan loglar için varsayılan veya hata işleme
  }
}

[fields][log_type] gibi iç içe alanlara erişim, özellikle Filebeat gibi ajanların eklediği meta verilerle çalışırken yaygındır.

Test Etme ve Hata Ayıklama

Logstash filtreleri karmaşık olabilir ve doğru çalışıp çalışmadıklarını test etmek önemlidir:

* stdout Çıktısı (codec => rubydebug): Geliştirme aşamasında, output bloğuna stdout { codec => rubydebug } eklemek, işlenmiş log olaylarının konsola okunabilir bir JSON formatında yazılmasını sağlar. Bu, filtrelerinizin beklediğiniz gibi alanları çıkarıp çıkarmadığını görmek için paha biçilmezdir.
* Grok Debugger: Grok desenlerini test etmek için çevrimiçi Grok Debugger araçlarını (örn. Grok Debugger by Elastic) kullanın. Bu araçlar, desenlerinizi ham log satırlarınız üzerinde gerçek zamanlı olarak test etmenizi ve hataları ayıklamanızı sağlar.
* Sentetik Veri: Gerçek log verilerinizin küçük, temsili örneklerini kullanarak filtrelerinizi test edin.
* Logstash Logları: Logstash’in kendi loglarını (/var/log/logstash/logstash-plain.log) düzenli olarak kontrol edin. Filtre hataları veya yapılandırma sorunları burada görünecektir.

Performans İpuçları

* grok Verimliliği: grok desenlerinizin mümkün olduğunca spesifik olmasını sağlayın. GREEDYDATA gibi çok geniş desenleri dikkatli kullanın, çünkü bunlar performansı düşürebilir. Mümkünse, daha kısa ve hedefe yönelik desenler tercih edin.
* Filtre Sırası: En sık eşleşen veya en az kaynak tüketen filtreleri pipeline’ın başlarına yerleştirin. drop filtrelerini erken kullanmak, gereksiz işlem yükünü azaltır.
* Koşullu Filtreleme: Her log olayına tüm filtreleri uygulamak yerine, if koşulları kullanarak sadece ilgili filtreleri çalıştırın.
* Tekrarlayan İşlemlerden Kaçının: Aynı işlemi birden fazla filtrede yapmaktan kaçının.
* Bellek ve CPU: Logstash’e yeterli bellek ve CPU kaynakları ayırın. Filtrelerin karmaşıklığı arttıkça, Logstash’in kaynak ihtiyacı da artar.

Gerçek Dünya Senaryoları ve Örnek Uygulamalar

Logstash filtrelerinin gerçek dünyadaki uygulamalarını birkaç örnekle inceleyelim.

Apache Erişim Loglarının İşlenmesi

Apache erişim logları, web sunucusu etkinliği hakkında zengin bilgiler içerir. Bu logları doğru bir şekilde ayrıştırmak, web sitesi trafiğini, kullanıcı davranışlarını ve potansiyel güvenlik tehditlerini anlamak için kritik öneme sahiptir.

Hedef: Apache combined log formatını ayrıştırmak, zaman damgasını ayarlamak, IP adresinden coğrafi bilgi eklemek ve gereksiz alanları kaldırmak.

input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][log_type] == "apache_access" {
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
      # Eğer grok başarısız olursa, bir etiket ekle
      add_tag => [ "_grokparsefailure_apache" ]
    }
    date {
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      target => "@timestamp"
      # Başarısız olursa etiket ekle
      add_tag => [ "_dateparsefailure_apache" ]
    }
    geoip {
      source => "clientip"
      # Başarısız olursa etiket ekle
      add_tag => [ "_geoipfailure" ]
    }
    mutate {
      # Bazı alanları sayıya dönüştür
      convert => { "bytes" => "integer" }
      convert => { "response" => "integer" }
      # Gereksiz alanları kaldır
      remove_field => [ "ident", "auth", "timestamp" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "apache-access-%{+YYYY.MM.dd}"
  }
}

Bu yapılandırma, Apache loglarını alır, ayrıştırır, coğrafi bilgi ekler, veri tiplerini dönüştürür ve gereksiz alanları temizler. Başarısız olan filtreler için etiketler eklenmesi, sorun gidermeyi kolaylaştırır.

Syslog Loglarının Yapılandırılması

Syslog, Linux sistemlerinde ve ağ cihazlarında yaygın olarak kullanılan bir loglama protokolüdür. Farklı cihazlardan gelen syslog mesajları genellikle benzer bir yapıya sahiptir ancak mesaj içeriği büyük ölçüde değişebilir.

Hedef: Syslog mesajlarını ayrıştırmak, ana makine adını çıkarmak, zaman damgasını ayarlamak ve mesaj içeriğini daha fazla işlemek.

input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][log_type] == "syslog" {
    grok {
      # Syslog başlığını ayrıştır
      match => { "message" => "<%{POSINT:syslog_pri}>%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{PROG:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_tag => [ "_grokparsefailure_syslog" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss", "ISO8601" ]
      target => "@timestamp"
      add_tag => [ "_dateparsefailure_syslog" ]
    }
    # Eğer syslog_message içinde anahtar-değer çiftleri varsa, onları da ayrıştır
    if "syslog_message" in [tags] { # Sadece grok başarılı olduysa devam et
      kv {
        source => "syslog_message"
        field_split => ", "
        value_split => "="
        # Ayrıştırılan alanları syslog_data alt alanına koy
        target => "syslog_data"
        # Bazı alanları kaldır
        remove_field => [ "syslog_message" ]
      }
    }
    mutate {
      remove_field => [ "syslog_timestamp", "syslog_pri" ]
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "syslog-%{+YYYY.MM.dd}"
  }
}

Bu örnek, syslog mesajının başlığını ayrıştırır, ardından mesajın içeriğinde anahtar-değer çiftleri varsa kv filtresiyle bunları da işler.

Özel Uygulama Loglarının Ayrıştırılması

Birçok uygulama, kendi özel formatlarında loglar üretir. Bu loglar genellikle JSON, XML veya özel ayrılmış metin formatında olabilir.

Hedef: Özel bir uygulamanın virgülle ayrılmış loglarını (CSV benzeri) ayrıştırmak.

input {
  beats {
    port => 5044
  }
}

filter {
  if [fields][log_type] == "my_app_log" {
    csv {
      separator => ","
      columns => ["timestamp", "log_level", "user_id", "action", "status", "message"]
      add_tag => [ "_csvparsefailure_myapp" ]
    }
    date {
      match => [ "timestamp", "ISO8601" ]
      target => "@timestamp"
      add_tag => [ "_dateparsefailure_myapp" ]
    }
    mutate {
      convert => { "user_id" => "integer" }
    }
    # Belirli bir seviyenin altındaki logları at
    if [log_level] == "DEBUG" or [log_level] == "TRACE" {
      drop {}
    }
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
    index => "my-app-logs-%{+YYYY.MM.dd}"
  }
}

Bu örnekte, csv filtresi kullanılarak virgülle ayrılmış loglar ayrıştırılır, zaman damgası ayarlanır, user_id alanı tam sayıya dönüştürülür ve “DEBUG” veya “TRACE” seviyesindeki loglar atılır.

Sonuç: Gelişmiş Loglama ve Analiz İçin Filtrelerin Önemi

Merkezi loglama, modern IT altyapılarının vazgeçilmez bir parçasıdır. Logstash, bu ekosistemin kalbinde yer alarak, ham ve dağınık log verilerini anlamlı, yapılandırılmış ve analiz edilebilir bilgilere dönüştürme görevini üstlenir. Bu dönüşüm sürecinin anahtarı ise Logstash filtreleridir.

grok ile yapılandırılmamış metinleri ayrıştırmaktan, date ile zaman damgalarını standardize etmeye, mutate ile alanları manipüle etmeye, json ve kv ile yapılandırılmış verileri işlemeye, geoip ile coğrafi zenginleştirme yapmaya ve drop ile gereksiz gürültüyü temizlemeye kadar, Logstash filtreleri geniş bir yelpazede yetenekler sunar. if koşullarıyla birleştiğinde, bu filtreler son derece esnek ve güçlü pipeline’lar oluşturulmasına olanak tanır.

Logstash filtrelerini etkin bir şekilde kullanmak, sadece logların Elasticsearch’e gönderilmesini sağlamakla kalmaz, aynı zamanda:

* Analitik Değeri Artırır: Yapılandırılmış veriler üzerinde daha karmaşık sorgular ve görselleştirmeler yapılmasını sağlar.
* Sorun Gidermeyi Hızlandırır: Anlamlı alanlar sayesinde, belirli bir hatayı veya olayı hızla bulmayı ve kök nedenini belirlemeyi kolaylaştırır.
* Güvenliği İyileştirir: Güvenlik olaylarını, anormal davranışları veya saldırı girişimlerini tespit etmek için logları daha etkin bir şekilde analiz etmeye olanak tanır.
* Performansı ve Depolama Verimliliğini Artırır: Gereksiz verileri atarak veya özetleyerek hem depolama maliyetlerini düşürür hem de Elasticsearch’teki indeksleme performansını optimize eder.
* Veri Tutarlılığını Sağlar: Farklı kaynaklardan gelen logları standardize ederek, tutarlı bir analiz çerçevesi sunar.

Logstash Forwarder (veya güncel olarak Filebeat) gibi hafif ajanlar logları toplarken, Logstash filtreleri bu ham verileri bilgiye dönüştüren beyin görevini üstlenir. Bu filtrelerin doğru bir şekilde tasarlanması, uygulanması ve sürdürülmesi, merkezi loglama sisteminizin başarısı için kritik öneme sahiptir. Unutulmamalıdır ki, iyi bir loglama stratejisi, sadece logları toplamakla kalmaz, aynı zamanda onları anlamlı hale getirerek iş ve operasyonel kararlar için değerli bir kaynak haline getirir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

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

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.