Disk doldu, site düştü: Log döndürme ve journald sınırları

Küçük bir VPS'te disk genellikle verilerle değil, kimsenin bakmadığı log dosyalarıyla dolar. Yeri neyin kapladığını bulmayı, logrotate, journald ve Docker log sınırlarını ayarlamayı anlatıyorum.

Bir sabah site 500 veriyor, veritabanı yazamıyor, oturumlar açılmıyor. df -h komutu sebebi söylüyor: disk %100 dolu. Çoğu zaman suçlu, aylardır büyüyen bir log dosyasıdır.

Yeri ne kaplıyor?

df -h
sudo du -xh /var --max-depth=2 | sort -h | tail -20
journalctl --disk-usage

Bir dosyayı sildiğiniz halde yer açılmadıysa, dosya hâlâ bir süreç tarafından açık tutuluyordur:

sudo lsof +L1

İlgili servisi yeniden başlatınca yer geri gelir.

logrotate

Uygulamanız kendi log dosyasına yazıyorsa /etc/logrotate.d/uygulama:

/srv/uygulama/storage/logs/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}

14 günden eski loglar silinir, öncekiler sıkıştırılır. copytruncate, dosyayı açık tutan uygulamayı yeniden başlatmadan döndürmeyi sağlar. Ayarı denemek için: sudo logrotate -d /etc/logrotate.d/uygulama.

journald'a sınır koymak

/etc/systemd/journald.conf içinde:

[Journal]
SystemMaxUse=500M

Ardından sudo systemctl restart systemd-journald. Hemen yer açmak gerekirse: sudo journalctl --vacuum-size=200M.

Docker konteyner logları

Varsayılan json-file sürücüsü logları sınırsız tutar. /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": { "max-size": "10m", "max-file": "3" }
}

Dikkat: bu ayar yalnızca yeni oluşturulan konteynerlere uygulanır. Mevcut konteynerleri yeniden oluşturmanız gerekir.

Erken uyarı

Disk %80'i geçtiğinde bildirim gönderen basit bir cron betiği bile bu sabahı yaşamamanız için yeterli.

İlgili Yazılar