Log Toplama ve İşleme Süreci -1: Nginx, Filebeat, Logstash Kullanımı

Yunus Emre Polat
Arabam Labs
Published in
3 min readJun 28, 2024

Bu makalede, log toplama ve işleme sürecimizi inceliyoruz. Çalışmamızda kullandığımız farklı bileşenlerin tanımlamalarını aşağıda bulabilirsiniz:

  • Nginx: Yüksek performanslı bir HTTP ve reverse proxy sunucusudur. Web sunucusu olarak geniş çapta kullanılır ve günlüklerimizi toplamak için bir temel oluşturur.
  • Logstash: Logları merkezi bir noktada toplamak ve işlemek için kullanılan açık kaynaklı bir veri koleksiyon motorudur. Logstash, logları alır ve istenilen formatta çıktı olarak gönderir.
  • Filebeat: Log dosyalarını izleyip Logstash’e veya Elasticsearch’e gönderen bir platformdur. Logstash veya Elasticsearch’e veri gönderme işlemlerini hızlandırır ve verimliliği artırır.

Bu üç bileşen, bir araya geldiğinde, loglarımızı etkin bir şekilde toplamamıza ve işlememize yardımcı olur.

Amaç

Aşağıdaki resimde gördüğünüz gibi trafiğin loglarını Elasticsearch’e yazdırıyoruz.

  • Nginx: Trafiği karşılayan taraf
  • Filebeat: Nginx hostu üzerinde çalışan servis ile nginx loglarını logstash’e gönderir.
  • Logstash: Filebeat’den gelen ham logları grok pattern ile parse edip elasticsearch’e yazar.

Nginx Konfigurasyonu

Bu nginx.conf’u üzerinde /test/ pathine gelen istekleri access.log ve error.log olmak üzere aşağıdaki pathlere logluyoruz.

/var/log/nginx/test-error.log
/var/log/nginx/test-access.log

        location /test/ {
mirror /mirror;
proxy_pass http://varnish;
proxy_set_header X-Cache-ttl $tall;
gzip on;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
proxy_http_version 1.1;
proxy_buffering off;
proxy_read_timeout 90;
proxy_connect_timeout 90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-ip $remote_addr;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Forwarded-Port 443;
proxy_set_header Proxy "";
access_log /var/log/nginx/test-access.log web_ext;
error_log /var/log/nginx/test-error.log warn;

FileBeat Konfigurasyonu

Nginx ile kaydettiğimiz logların hepsini Filebeat ile alıp logtash’e yolladığımız konfigürasyon aşağıdaki gibidir.

http:
enabled: true
host: 0.0.0.0
port: 5066
filebeat.inputs:
- type: log
enabled: true
tags: ["nginx-test-access"]
start_position: "end"
paths:
- /var/log/nginx/test-access.log
exclude_files: ['.gz$']
- type: log
enabled: true
tags: ["nginx-test-error"]
start_position: "end"
paths:
- /var/log/nginx/test-error.log
exclude_files: ['.gz$']
output.logstash:
# The Logstash hosts
hosts: ["11.12.13.14:5045"]
bulk_max_size: 4096

Logstash Konfigürasyon

Aşağıdaki gibi konfigürasyon yapabilirsiniz

  if "nginx-test-access" in [tags] {
grok {
match => [ "message" , '%{IPORHOST:remote_addr} - %{DATA:remote_user} \[%{HTTPDATE:time_local}\] \"%{WORD:request} %{DATA:url} HTTP/%{NUMBER:http_version}\" %{NUMBER:status} %{NUMBER:body_bytes_sent} \"%{DATA:http_referer}\" \"%{DATA:http_user_agent}\" \"%{DATA:http_x_forwarded_for}\" \"%{DATA:host}\" sn=\"%{DATA:server_name}\" rt=%{NUMBER:request_time} ua=\"%{DATA:upstream_addr}\" us=\"%{DATA:upstream_status}\" ut=\"%{DATA:upstream_response_time}\" ul=\"%{DATA:upstream_response_length}\" cs=\"%{DATA:cache_status}\" uct=\"%{DATA:upstream_connect_time}\" ht=\"%{DATA:upstream_header_time}\" ssl=\"%{DATA:ssl_version}\" cipher=\"%{DATA:tls_cipher_version}\" bs=\"%{NUMBER:bytes_sent}\" rl=%{NUMBER:request_length}']
overwrite => [ "message" ]
}
mutate {
convert => ["status", "integer"]
convert => ["body_bytes_sent", "integer"]
convert => ["upstream_response_time", "float"]
convert => ["upstream_connect_time", "float"]
convert => ["upstream_header_time", "float"]
}
geoip {
source => "remote_addr"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "http_user_agent"
}
}
if "nginx-test-error" in [tags] {
grok {
match => [ "message" , "(?<timestamp>%{YEAR}[./]%{MONTHNUM}[./]%{MONTHDAY} %{TIME}) \[%{LOGLEVEL:severity}\] %{POSINT:pid}#%{NUMBER:threadid}\: \*%{NUMBER:connectionid} %{GREEDYDATA:errormessage}, client: %{IP:client}, server: %{GREEDYDATA:server}, request: \"%{GREEDYDATA:request}\", subrequest: \"%{GREEDYDATA:subrequest}\", upstream: \"%{GREEDYDATA:upstream}\", host: \"%{GREEDYDATA:host}\", referrer: \"%{GREEDYDATA:referrer}\""]
overwrite => [ "message" ]
}
mutate {
convert => ["status", "integer"]
convert => ["body_bytes_sent", "integer"]
convert => ["upstream_response_time", "float"]
convert => ["upstream_connect_time", "float"]
convert => ["upstream_header_time", "float"]
}
geoip {
source => "remote_addr"
target => "geoip"
add_tag => [ "nginx-geoip" ]
}
date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
remove_field => [ "timestamp" ]
}
useragent {
source => "http_user_agent"
}
}
if "nginx-test-error" in [tags] {
elasticsearch {
hosts => ["https://15.16.17.18:9200"]
cacert => '/etc/logstash/es.crt'
user => 'admin'
password => 'xxxx'
action => "create"
ssl => true
ssl_certificate_verification => "true"
index => "nginx-test-error"
}
}
if "nginx-test-access" in [tags] {
elasticsearch {
hosts => ["https://15.16.17.18:9200"]
cacert => '/etc/logstash/es.crt'
user => 'admin'
password => 'xxxx'
action => "create"
ssl => true
ssl_certificate_verification => "true"
index => "nginx-test-access"
}
}

Sonuç

Nginx, Logstash ve Filebeat’i etkin bir şekilde birleştirerek, logları toplama, işleme ve saklama konusunda sağlam bir sistem oluşturduk. Her bileşeni doğru şekilde yapılandırarak, tüm gerekli verileri yakalayabilir ve hızlı ve etkili bir şekilde analiz edebileceğimiz bir şekilde işleyebiliriz. Bu sistem, operasyonlarımızdaki performans ve güvenlik standartlarını yüksek tutmak için hayati öneme sahiptir.

--

--