Syslog ile Docker Konteyner Loglarını Toplama
Docker ile çalışıyorsanız, bir süre sonra kaçınılmaz olarak şu soruyla yüzleşiyorsunuz: “Bu konteynerlerin logları nerede, nasıl izliyorum?” Varsayılan olarak Docker, logları kendi iç yapısında JSON formatında tutar ve docker logs komutuyla bunlara erişebilirsiniz. Ama üretim ortamında onlarca, yüzlerce konteyner çalıştırıyorsanız bu yöntem yetersiz kalır. İşte tam bu noktada syslog devreye girer. Syslog, Linux dünyasının köklü log altyapısıdır ve Docker’ın bu sisteme entegrasyonu oldukça güçlüdür. Bu yazıda Docker konteyner loglarını syslog üzerinden merkezi olarak nasıl toplayacağınızı, nasıl yönlendireceğinizi ve pratikte nasıl kullanışlı hale getireceğinizi adım adım ele alacağız.
Neden Syslog?
docker logs komutunu açıp bakmanız için konteynerin hala çalışıyor olması ya da en azından Docker daemon’ının konteyner geçmişini tutmuş olması gerekir. Konteyner silindiğinde loglar da gider. Bu durum, özellikle otomatik ölçeklenen veya sık yeniden başlatılan ortamlarda ciddi bir sorun yaratır.
Syslog ile şunları elde edersiniz:
- Merkezi log toplama: Tüm konteynerlerin logları tek bir yere akar
- Kalıcılık: Konteyner silinse bile loglar syslog sunucusunda saklanır
- Standart araç uyumu: rsyslog, syslog-ng, Graylog, ELK Stack ile doğrudan entegre olur
- Log rotasyonu: Sistem düzeyinde log yönetimi otomatik çalışır
- Uzak sunucuya gönderim: Logları başka bir makinede merkezi olarak toplayabilirsiniz
Docker Logging Driver Mimarisi
Docker, farklı log hedefleri için “logging driver” konseptini kullanır. Varsayılan sürücü json-file‘dır. Ancak desteklenen diğer sürücüler arasında syslog, journald, fluentd, awslogs ve splunk gibi seçenekler bulunur.
Syslog sürücüsünü kullanmaya başlamadan önce nasıl çalıştığını anlamak önemlidir. Docker, her konteynerden gelen standart çıktı (stdout) ve hata çıktısını (stderr) yakalar ve seçilen sürücü üzerinden iletir. Syslog sürücüsü seçildiğinde bu çıktı doğrudan sistemin syslog soketine veya uzak bir syslog sunucusuna gönderilir.
Yerel Syslog Kurulumu ve Yapılandırması
rsyslog Kurulumu
Çoğu modern Linux dağıtımında rsyslog zaten kurulu gelir. Kurulu olup olmadığını kontrol edelim:
systemctl status rsyslog
# Ubuntu/Debian için kurulum
sudo apt-get install -y rsyslog
# CentOS/RHEL için kurulum
sudo yum install -y rsyslog
Docker loglarını ayrı bir dosyada tutmak için rsyslog’a özel bir kural ekleyelim:
sudo nano /etc/rsyslog.d/docker.conf
Dosya içeriği şöyle olmalı:
# Docker konteyner loglarini ayri dosyaya yonlendir
:programname, startswith, "docker" /var/log/docker/containers.log
# Eger konteyner adi ile programname eslestiriyorsaniz
:syslogtag, contains, "docker/" /var/log/docker/containers.log
& stop
Log dizinini oluşturup rsyslog’u yeniden başlatalım:
sudo mkdir -p /var/log/docker
sudo chown syslog:adm /var/log/docker
sudo systemctl restart rsyslog
Docker’ı Syslog ile Çalıştırmak
Tek Konteyner Bazında Syslog Kullanımı
En basit kullanım şekli, bir konteyneri başlatırken --log-driver parametresini belirtmektir:
docker run -d
--name nginx-test
--log-driver=syslog
--log-opt syslog-address=unix:///dev/log
--log-opt tag="nginx-{{.Name}}"
nginx:latest
Burada birkaç önemli parametre var:
- –log-driver=syslog: Syslog sürücüsünü aktif eder
- –log-opt syslog-address: Log’ların gönderileceği syslog adresi, yerel soket veya uzak sunucu olabilir
- –log-opt tag: Log satırlarında görünecek etiket, konteyner adını dinamik olarak içerebilir
Logların gelip gelmediğini kontrol edelim:
tail -f /var/log/docker/containers.log
# Ya da direkt syslog'a bakabilirsiniz
tail -f /var/log/syslog | grep nginx
Docker Daemon Düzeyinde Global Yapılandırma
Her konteyner için tek tek parametre vermek yerine Docker daemon’ını varsayılan olarak syslog kullanacak şekilde yapılandırabilirsiniz. Bu yöntem, yeni başlayan herkes için önerilmez çünkü docker logs komutunu kullanılamaz hale getirir, ancak syslog tabanlı bir log altyapınız varsa son derece pratiktir.
sudo nano /etc/docker/daemon.json
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "unix:///dev/log",
"tag": "docker/{{.Name}}/{{.ID}}",
"syslog-facility": "daemon",
"syslog-format": "rfc5424"
}
}
Parametrelerin açıklamaları:
- syslog-address: Hedef adres,
unix://,tcp://veyaudp://protokollerini destekler - tag: Her log satırına eklenen etiket,
{{.Name}}konteyner adını,{{.ID}}kısa konteyner ID’sini temsil eder - syslog-facility: Syslog facility değeri,
daemon,local0‘danlocal7‘ye kadar özelleştirilebilir - syslog-format:
rfc5424veyarfc3164formatlarından birini seçebilirsiniz
Docker daemon’ı yeniden başlatmayı unutmayın:
sudo systemctl restart docker
Uzak Syslog Sunucusuna Log Gönderimi
Gerçek dünya senaryolarında logları birden fazla sunucudan merkezi bir log sunucusuna toplamak istersiniz. Bu durum için Docker’ı uzak syslog adresiyle yapılandırırız.
Merkezi Log Sunucusu Kurulumu
Merkezi log sunucunuzda rsyslog’u TCP üzerinden dinleyecek şekilde yapılandıralım:
sudo nano /etc/rsyslog.conf
Aşağıdaki satırları etkinleştirin veya ekleyin:
# TCP dinleme - 514 portu
module(load="imtcp")
input(type="imtcp" port="514")
# UDP dinleme
module(load="imudp")
input(type="imudp" port="514")
# Gelen loglari kaynak IP'ye gore ayir
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& ~
sudo mkdir -p /var/log/remote
sudo systemctl restart rsyslog
# Firewall kuralı ekle
sudo ufw allow 514/tcp
sudo ufw allow 514/udp
Docker’ı Uzak Sunucuya Yönlendirme
docker run -d
--name web-app
--log-driver=syslog
--log-opt syslog-address=tcp://192.168.1.100:514
--log-opt syslog-facility=local0
--log-opt tag="prod/web-app/{{.Name}}"
--log-opt syslog-format=rfc5424
myapp:latest
TCP yerine TLS ile şifreli gönderim yapmak istiyorsanız:
docker run -d
--name secure-app
--log-driver=syslog
--log-opt syslog-address=tcp+tls://192.168.1.100:6514
--log-opt syslog-tls-ca-cert=/etc/ssl/certs/ca.pem
--log-opt syslog-tls-cert=/etc/ssl/certs/client.pem
--log-opt syslog-tls-key=/etc/ssl/private/client-key.pem
--log-opt tag="prod/secure/{{.Name}}"
myapp:latest
Docker Compose ile Syslog Entegrasyonu
Gerçek dünya projelerinde genellikle docker-compose kullanırsınız. Syslog yapılandırmasını compose dosyasına eklemek çok kolaydır:
version: '3.8'
services:
webapp:
image: nginx:latest
ports:
- "80:80"
logging:
driver: syslog
options:
syslog-address: "tcp://log-server:514"
syslog-facility: "local1"
tag: "prod/webapp/{{.Name}}"
syslog-format: "rfc5424"
database:
image: postgres:15
environment:
POSTGRES_PASSWORD: secretpassword
logging:
driver: syslog
options:
syslog-address: "tcp://log-server:514"
syslog-facility: "local2"
tag: "prod/database/{{.Name}}"
syslog-format: "rfc5424"
cache:
image: redis:7
logging:
driver: syslog
options:
syslog-address: "unix:///dev/log"
syslog-facility: "local3"
tag: "prod/cache/{{.Name}}"
Her servis için farklı facility değeri kullanmak, daha sonra log filtreleme ve yönlendirme açısından büyük kolaylık sağlar. Örneğin local1 web, local2 veritabanı, local3 önbellek logları için ayrılmış olur ve rsyslog kurallarında bu değerlere göre ayrıştırma yapabilirsiniz.
rsyslog ile Akıllı Log Yönlendirme
Konteynerlerden gelen logları sadece toplamak yetmez, anlamlı şekilde organize etmeniz de gerekir. rsyslog’un güçlü filtreleme mekanizmasını kullanarak her servisi ayrı dosyaya yazabiliriz:
sudo nano /etc/rsyslog.d/50-docker-containers.conf
# Template: Konteyner adina gore dosya olustur
$template DockerLogs,"/var/log/docker/%syslogtag:R,ERE,1,FIELD:docker/([^/]+)--recovery%/%$YEAR%-%$MONTH%-%$DAY%.log"
# local1 facility - Web servisleri
local1.* -?DockerLogs
local1.* ~
# local2 facility - Veritabani servisleri
local2.* /var/log/docker/databases/%$YEAR%-%$MONTH%-%$DAY%.log
local2.* ~
# local3 facility - Cache servisleri
local3.* /var/log/docker/cache/%$YEAR%-%$MONTH%-%$DAY%.log
local3.* ~
# Docker kaynaklı tüm loglar icin genel kural
:syslogtag, contains, "docker/" /var/log/docker/all-containers.log
Log dizinlerini oluşturalım:
sudo mkdir -p /var/log/docker/{databases,cache}
sudo chown -R syslog:adm /var/log/docker
sudo systemctl restart rsyslog
Log Rotasyonu Yapılandırması
Konteyner logları hızla büyüyebilir. logrotate ile otomatik rotasyon kuralı ekleyelim:
sudo nano /etc/logrotate.d/docker-containers
/var/log/docker/*.log
/var/log/docker/**/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
create 0640 syslog adm
dateext
dateformat -%Y%m%d
}
Rotasyonun doğru çalışıp çalışmadığını test edin:
sudo logrotate -d /etc/logrotate.d/docker-containers
# Zorla çalıştırmak için
sudo logrotate -f /etc/logrotate.d/docker-containers
Gerçek Dünya Senaryosu: Üretim Ortamında Sorun Giderme
Bir e-ticaret platformu için Docker tabanlı bir altyapı yönetiyorsunuz diyelim. Gece 2’de ödeme servisi hata vermeye başlıyor. Konteyner çoktan yeniden başlamış ve docker logs ile eski loglar görünmüyor. Ama syslog altyapınız varsa:
# Belirli bir zaman aralığındaki hataları filtrele
grep "payment-service" /var/log/docker/all-containers.log |
grep "ERROR|CRITICAL|Exception" |
awk '$0 >= "2024-01-15T02:00" && $0 <= "2024-01-15T03:00"'
# Ya da journalctl ile (syslog journald'ye de yazıyorsa)
journalctl --since "2024-01-15 02:00" --until "2024-01-15 03:00"
SYSLOG_IDENTIFIER=payment-service
# rsyslog ile gelen logları canlı izle
tail -f /var/log/docker/all-containers.log | grep "payment"
Bu senaryo, syslog entegrasyonunun neden kritik olduğunu açıkça gösteriyor. Konteyner yaşam döngüsünden bağımsız, zaman damgalı ve aranabilir loglar olmadan üretim sorunlarını çözmek neredeyse imkansız hale gelir.
Syslog-ng ile Alternatif Yapılandırma
Bazı ortamlarda rsyslog yerine syslog-ng tercih edilir. Yapılandırma sözdizimi farklıdır ama mantık aynıdır:
# /etc/syslog-ng/conf.d/docker.conf
source s_docker_tcp {
network(
transport("tcp")
port(514)
flags(no-parse)
);
};
filter f_docker_web {
facility(local1);
};
filter f_docker_db {
facility(local2);
};
destination d_docker_web {
file("/var/log/docker/web/${YEAR}-${MONTH}-${DAY}.log"
template("${ISODATE} ${HOST} ${MSGHDR}${MSG}n")
dir-perm(0755)
perm(0644)
);
};
destination d_docker_db {
file("/var/log/docker/db/${YEAR}-${MONTH}-${DAY}.log"
template("${ISODATE} ${HOST} ${MSGHDR}${MSG}n")
dir-perm(0755)
perm(0644)
);
};
log {
source(s_docker_tcp);
filter(f_docker_web);
destination(d_docker_web);
};
log {
source(s_docker_tcp);
filter(f_docker_db);
destination(d_docker_db);
};
Yaygın Sorunlar ve Çözümleri
Syslog entegrasyonunda karşılaşacağınız bazı tipik sorunlar ve çözümleri:
Konteyner başlamıyor, syslog address hatası veriyor
# Syslog soketinin varlığını kontrol edin
ls -la /dev/log
# Yoksa rsyslog'u başlatın
sudo systemctl start rsyslog
# Docker daemon.json'da adresin doğru olduğunu kontrol edin
cat /etc/docker/daemon.json
Loglar geliyor ama tag alanı boş görünüyor
# Tag formatını test edin, boşluk veya özel karakter sorun yaratabilir
docker run --rm
--log-driver=syslog
--log-opt syslog-address=unix:///dev/log
--log-opt tag="test-container"
alpine echo "test mesaji"
# Sonra kontrol edin
grep "test-container" /var/log/syslog
Uzak sunucuya log gitmiyor
# Hedef sunucuda portu dinleyip dinlemediğini kontrol edin
ss -tulpn | grep 514
# Bağlantı testini yapin
nc -zv 192.168.1.100 514
# rsyslog'un network modülünün yüklü olduğunu kontrol edin
rsyslogd -N1 2>&1 | grep -i "tcp|udp"
Log dosyaları çok hızlı büyüyor
Docker’ın kendi log boyutu sınırlamasını syslog sürücüsü ile birlikte kullanabilirsiniz. Syslog sürücüsünde Docker tarafında boyut sınırı yoktur, bu yüzden rsyslog tarafında logrotate ve disk izleme kritik önem taşır. Bunun yanında uygulamanızın hata ayıklama modunda çalışmadığından emin olun.
Güvenlik Konuları
Log verisi hassas bilgiler içerebilir. Bazı önemli güvenlik pratikleri:
- Uzak syslog sunucusuna gönderimde mutlaka TLS kullanın, özellikle farklı network segmentleri arasında
- Log dosyalarının izinlerini kısıtlayın, sadece yetkili kullanıcılar okuyabilmeli
- Log sunucusunu ayrı bir ağ segmentine koyun ve sadece log trafiğine izin verin
- Logları belirli bir süre sonra şifrelenmiş arşive taşıyın
- Log sunucusuna yazma erişimi olan sistemleri minimumda tutun, log enjeksiyonu gerçek bir saldırı vektörüdür
# Log dosyası izinlerini düzenle
sudo chmod 640 /var/log/docker/*.log
sudo chown syslog:adm /var/log/docker/*.log
# sadece adm grubundaki kullanıcılar okuyabilir
sudo usermod -aG adm yourusername
Sonuç
Syslog ile Docker konteyner loglarını toplamak, başlangıçta karmaşık görünse de sistematik bir şekilde ele alındığında son derece güçlü bir altyapı ortaya çıkarır. Temel akışı şöyle özetleyebiliriz: Docker’ı syslog sürücüsü kullanacak şekilde yapılandırırsınız, rsyslog veya syslog-ng ile logları alıp organize edersiniz, logrotate ile boyutu kontrol altında tutarsınız ve sorun anında aranabilir, zaman damgalı kayıtlarınız hazır olur.
Önerim, önce geliştirme ortamında yerel syslog soketiyle başlayın. Her şey doğru çalışınca uzak log sunucusu adımına geçin. Üretim ortamı için TLS şifrelemesini ve düzenli log rotasyonunu mutlaka kurun. Konteyner tabanlı altyapılarda observability’nin en temel ayağı log yönetimidir ve syslog bu temeli sağlam bir şekilde oluşturmanızı sağlar. İlerleyen adımda bu logları Graylog veya ELK Stack’e besleyerek görsel analiz ve uyarı mekanizmaları da kurabilirsiniz, ama o konu ayrı bir yazının konusu.
