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.