Merhaba arkadaşlar, bugün sizlere Docker konteyner loglarını nasıl daha profesyonel bir şekilde yönetebileceğimizi anlatacağım. Varsayılan olarak Docker, konteyner loglarını JSON formatında dosyaya yazar. Bu yöntem basit gibi görünse de, uzun vadede disk alanını tüketebilir ve merkezi log takibini zorlaştırır. Bu rehberde, logları hem bir syslog sunucusuna (örn: rsyslog) yönlendirip hem de yerel JSON log dosyalarını otomatik döndürmeyi (rotasyon) adım adım kuracağız.
Mevcut Docker Log Sürücüsünü Anlamak
Öncelikle, mevcut konteynerimizin hangi log sürücüsünü kullandığını kontrol edelim. Varsayılan sürücü genellikle `json-file`'dır.
Ayrıca bir konteynerin log dosyasının nerede olduğunu görmek için aşağıdaki komutu kullanabilirsiniz. Bu bize log dosyasının boyutu hakkında da fikir verir.
Syslog Sürücüsü ile Logları Yönlendirme
İlk hedefimiz, logları konteyner bazında veya tüm Docker Daemon için bir syslog sunucusuna göndermek. Ben genelde her konteyner için ayrı ayrı tag (etiket) atayarak yapmayı tercih ediyorum, böylece hangi logun hangi servise ait olduğu syslog sunucusunda da net anlaşılıyor.
Yeni bir konteyner çalıştırırken log sürücüsünü direkt belirleyebiliriz:
Eğer mevcut çalışan bir konteynerin log sürücüsünü değiştirmek istiyorsanız, konteyneri durdurup yeniden oluşturmanız gerekir. Bu yüzden log stratejinizi en baştan belirlemek çok önemli.
Tüm Docker Daemon'ın varsayılan log sürücüsünü değiştirmek için ise /etc/docker/daemon.json dosyasını düzenlemeliyiz. Dosya yoksa oluşturun.
Değişikliği kaydettikten sonra Docker servisini yeniden başlatmayı unutmayın: `sudo systemctl restart docker`. Bu ayardan sonra çalıştırılan TÜM yeni konteynerler loglarını belirttiğiniz syslog adresine gönderecektir.
JSON-file Log Rotasyonu (Döndürme) Ayarları
Syslog'a yönlendirsek bile, çoğu zaman yerelde de bir miktar log tutmak isteyebiliriz veya syslog bağlantısı kesildiğinde logların kaybolmamasını sağlamak isteriz. Bu durumda `json-file` sürücüsünü kullanmaya devam edip, onu rotasyon ile birlikte yapılandıracağız.
Rotasyon, log dosyası belirli bir boyuta ulaştığında yenisinin oluşturulması ve eskilerinin sıkıştırılıp saklanması/silinmesidir. Bunu da yine /etc/docker/daemon.json dosyasından global olarak veya konteyner çalıştırırken parametre ile ayarlayabiliriz.
Global olarak ayarlamak için daemon.json dosyasına aşağıdaki gibi `json-file` sürücüsünün seçeneklerini ekliyoruz:
Bu ayar ne anlama geliyor?
- max-size: Her bir log dosyasının maksimum boyutu. 10m = 10 megabayt.
- max-file: Tutulacak maksimum log dosyası sayısı. 3 dosya demek: 1 ana log + 2 eski döndürülmüş log.
- compress: "true" yaparsanız, döndürülen eski log dosyaları (.gz formatında) otomatik sıkıştırılır. Disk tasarrufu için harika bir seçenek.
Bu ayarları sadece belirli bir konteyner için kullanmak isterseniz, run komutuna şu parametreleri ekleyebilirsiniz:
Dikkat Edilmesi Gerekenler ve Öneriler
1. Disk Alarmı: Rotasyon ayarlarını yapmazsanız, bir konteyner sürekli log üretiyorsa (örn: hata döngüsü) /var/lib/docker/containers/... altındaki log dosyası diskinizi doldurabilir. Mutlaka `max-size` ve `max-file` limiti koyun.
2. Syslog Sunucusu Yapılandırması: Logları yönlendirdiğiniz rsyslog sunucusunda, UDP/514 portunun açık olduğundan ve logların nereye yazılacağından emin olun. Aksi halde loglar kaybolur.
3. Performans: `json-file` sürücüsü genelde syslog'a göre daha hızlıdır. Yüksek log üretimi olan ortamlarda syslog'a yönlendirme ağ gecikmesi veya sunucu yükü yaratabilir. Test etmenizi öneririm.
4. Mevcut Logları Temizleme: Disk dolduysa ve eski logları temizlemek isterseniz, konteynerleri durdurmadan log dosyalarını manuel silmek sorun çıkarabilir. En temizi, logrotate gibi bir araç kullanmak veya Docker'ın kendi rotasyon mekanizmasına (yukarıda anlattığım) güvenmektir.
Sonuç
Bu yöntemlerle hem merkezi bir log sistemi (syslog/rsyslog) ile tüm loglarınızı bir noktadan takip edebilir, hem de yerelde kontrollü ve sıkıştırılmış log dosyaları tutarak disk alanınızı verimli kullanabilirsiniz. Benim sunucu grubumda genelde kritik üretim konteynerlerini syslog'a, geliştirme ve test ortamındakileri ise sıkı rotasyonlu json-file'a yönlendiriyorum.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir log sürücüsü (journald, fluentd, gelf) kullanan var mı? Deneyimlerinizi paylaşın veya aklınıza takılan bir şey olursa aşağıya yazmaktan çekinmeyin.
Öncelikle, mevcut konteynerimizin hangi log sürücüsünü kullandığını kontrol edelim. Varsayılan sürücü genellikle `json-file`'dır.
Bash:
docker info --format '{{.LoggingDriver}}'
Ayrıca bir konteynerin log dosyasının nerede olduğunu görmek için aşağıdaki komutu kullanabilirsiniz. Bu bize log dosyasının boyutu hakkında da fikir verir.
Bash:
docker inspect --format='{{.LogPath}}' <konteyner_adi_veya_id>
İlk hedefimiz, logları konteyner bazında veya tüm Docker Daemon için bir syslog sunucusuna göndermek. Ben genelde her konteyner için ayrı ayrı tag (etiket) atayarak yapmayı tercih ediyorum, böylece hangi logun hangi servise ait olduğu syslog sunucusunda da net anlaşılıyor.
Yeni bir konteyner çalıştırırken log sürücüsünü direkt belirleyebiliriz:
Bash:
docker run --log-driver=syslog --log-opt syslog-address=udp://<syslog_sunucu_ip>:514 --log-opt syslog-format=rfc5424 --log-opt tag="webapp" -d nginx:latest
Eğer mevcut çalışan bir konteynerin log sürücüsünü değiştirmek istiyorsanız, konteyneri durdurup yeniden oluşturmanız gerekir. Bu yüzden log stratejinizi en baştan belirlemek çok önemli.
Tüm Docker Daemon'ın varsayılan log sürücüsünü değiştirmek için ise /etc/docker/daemon.json dosyasını düzenlemeliyiz. Dosya yoksa oluşturun.
JSON:
{
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://192.168.1.100:514",
"syslog-format": "rfc5424",
"tag": "{{.Name}}"
}
}
Değişikliği kaydettikten sonra Docker servisini yeniden başlatmayı unutmayın: `sudo systemctl restart docker`. Bu ayardan sonra çalıştırılan TÜM yeni konteynerler loglarını belirttiğiniz syslog adresine gönderecektir.
Syslog'a yönlendirsek bile, çoğu zaman yerelde de bir miktar log tutmak isteyebiliriz veya syslog bağlantısı kesildiğinde logların kaybolmamasını sağlamak isteriz. Bu durumda `json-file` sürücüsünü kullanmaya devam edip, onu rotasyon ile birlikte yapılandıracağız.
Rotasyon, log dosyası belirli bir boyuta ulaştığında yenisinin oluşturulması ve eskilerinin sıkıştırılıp saklanması/silinmesidir. Bunu da yine /etc/docker/daemon.json dosyasından global olarak veya konteyner çalıştırırken parametre ile ayarlayabiliriz.
Global olarak ayarlamak için daemon.json dosyasına aşağıdaki gibi `json-file` sürücüsünün seçeneklerini ekliyoruz:
JSON:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3",
"compress": "true"
}
}
Bu ayar ne anlama geliyor?
- max-size: Her bir log dosyasının maksimum boyutu. 10m = 10 megabayt.
- max-file: Tutulacak maksimum log dosyası sayısı. 3 dosya demek: 1 ana log + 2 eski döndürülmüş log.
- compress: "true" yaparsanız, döndürülen eski log dosyaları (.gz formatında) otomatik sıkıştırılır. Disk tasarrufu için harika bir seçenek.
Bu ayarları sadece belirli bir konteyner için kullanmak isterseniz, run komutuna şu parametreleri ekleyebilirsiniz:
Bash:
docker run --log-driver=json-file --log-opt max-size=50m --log-opt max-file=5 --log-opt compress=true -d mysql:8
1. Disk Alarmı: Rotasyon ayarlarını yapmazsanız, bir konteyner sürekli log üretiyorsa (örn: hata döngüsü) /var/lib/docker/containers/... altındaki log dosyası diskinizi doldurabilir. Mutlaka `max-size` ve `max-file` limiti koyun.
2. Syslog Sunucusu Yapılandırması: Logları yönlendirdiğiniz rsyslog sunucusunda, UDP/514 portunun açık olduğundan ve logların nereye yazılacağından emin olun. Aksi halde loglar kaybolur.
3. Performans: `json-file` sürücüsü genelde syslog'a göre daha hızlıdır. Yüksek log üretimi olan ortamlarda syslog'a yönlendirme ağ gecikmesi veya sunucu yükü yaratabilir. Test etmenizi öneririm.
4. Mevcut Logları Temizleme: Disk dolduysa ve eski logları temizlemek isterseniz, konteynerleri durdurmadan log dosyalarını manuel silmek sorun çıkarabilir. En temizi, logrotate gibi bir araç kullanmak veya Docker'ın kendi rotasyon mekanizmasına (yukarıda anlattığım) güvenmektir.
Bu yöntemlerle hem merkezi bir log sistemi (syslog/rsyslog) ile tüm loglarınızı bir noktadan takip edebilir, hem de yerelde kontrollü ve sıkıştırılmış log dosyaları tutarak disk alanınızı verimli kullanabilirsiniz. Benim sunucu grubumda genelde kritik üretim konteynerlerini syslog'a, geliştirme ve test ortamındakileri ise sıkı rotasyonlu json-file'a yönlendiriyorum.
Peki siz bu konfigürasyonu kendi sunucularınızda nasıl yapıyorsunuz? Farklı bir log sürücüsü (journald, fluentd, gelf) kullanan var mı? Deneyimlerinizi paylaşın veya aklınıza takılan bir şey olursa aşağıya yazmaktan çekinmeyin.