Skip to content
VDS · Docker ve konteynerler

Container logları ve onları nasıl kaybetmezsin

Docker logları nerede saklanır, diski doldurmasınlar diye boyutlarını nasıl sınırlarsın ve kayıtların container yeniden oluşturulduktan sonra da kalması için ne yapmalısın.

23 Ağustos 2026 tarihinde güncellendi

Bir hizmet çöktüğünde, log tek doğruluk kaynağıdır. Varsayılan olarak Docker onu konteynerin yanındaki bir dosyaya yazar ve boyutuna hiçbir sınır koymaz: çok konuşkan bir uygulama bir hafta içinde tüm diski doldurabilir.

Nasıl okunur

docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50

Unutma: Docker, uygulamanın standart çıktıya ve standart hataya yazdıklarını gösterir. Eğer uygulama konteynerin içindeki kendi dosyasına yazıyorsa, docker logs hiçbir şey göstermez — logu konteynerin içinde aramalı ya da çıktıyı yönlendirmelisin.

docker compose exec app ls -la /var/log

Boyutu hemen sınırla

Tüm konteynerler için genel ayar /etc/docker/daemon.json dosyasındadır:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker

Bu ayar, yeniden başlatmadan sonra oluşturulan konteynerler için geçerlidir. Çalışanların yeniden oluşturulması gerekir. Tek bir hizmet için aynısı Compose'a yazılır:

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "20m"
        max-file: "3"

Sonuç: sınırsız büyüme yerine hizmet başına en fazla 60 MB.

Seni şaşırtmadan önce mevcut boyutu kontrol et: sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail. Çalışan bir dosyayı rm ile kısaltamazsın — Docker tanıtıcıyı (descriptor) elinde tuttuğu sürece alan serbest bırakılmaz. Doğru yol: konteyneri yeniden oluşturmak ya da sudo truncate -s 0 <file>.

Logların konteynerden sonra da kalmasını sağla

Log dosyası konteynerle birlikte silinir. Geçmiş önemliyse, onu sistem günlüğüne (journal) devret:

logging:
  driver: journald
  options:
    tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"

journald kayıtları kendi kendine döndürür ve /etc/systemd/journald.conf içindeki SystemMaxUse ayarıyla sınırlanır. Ne kadar yer kapladığını görmek için: journalctl --disk-usage.

Aynı anda birkaç hizmet için her şeyi tek bir yerde toplamak daha kullanışlıdır — örneğin, kayıtları güne göre dosyalara yazan özel bir toplayıcı konteynerle. Ama journald ile başla: zaten orada ve hiçbir maliyeti yok.

Bir kesintiyi hata ayıklarken nelere bakmalısın

  1. Çökmeden önceki son 200 satır: docker logs --tail 200 <container>.
  2. Çıkış kodu: docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>. 137 kodu ve OOMKilled içinde true, çekirdeğin belleği tükendiği için süreci öldürdüğü anlamına gelir — bkz. kaynak limitleri.
  3. Makinenin sistem logu: sudo dmesg -T | tail -50 bellek yetersizliğinden öldürmeleri ve disk hatalarını gösterir.

Sık yapılan hatalar

  • Disk loglarla doldu ve tüm hizmetler çöktü. Boyutu sınırlamak, Docker'ı kurduktan hemen sonra şart.
  • Zaten silinmiş bir konteynerin loguna bakmak. docker compose down sonrasında o gitmiştir. Kayıtları önceden journald içine topla.
  • Logdaki sırlar. Uygulamalar parolalı bağlantı dizelerini yazdırmayı çok sever. Makineye erişimi olan herkes logu okuyabilir.
  • Hatayı metin konsolunda aramak. O her zaman 80×24'tür ve uzun satırlar kesilir. Logları okumak için SSH ya da "Screen" konsolu daha kullanışlıdır.