Linux'ta logrotate ile günlük dosyalarının büyümesini önleme

Linux Sunucu (SSH) 71 görüntülenme Markdown

Bir sabah sunucunun diskinin dolu olduğunu görüyorsunuz ve suçlu /var/log altındaki tek bir dosyadır. Günlükler yararlıdır ama sınırsız büyürlerse diski bitirirler. logrotate bu işi otomatik halleder: dosyayı belli aralıkla yeniler (döndürür), eskileri sıkıştırır ve belirli sayıdan fazlasını siler.

Suçlu hangi dosya?

sudo du -ah /var/log | sort -rh | head -10
sudo journalctl --disk-usage

İlk komut /var/log içindeki en büyük dosyaları, ikincisi systemd günlüğünün (journal) kapladığı alanı gösterir.

systemd günlüğünü sınırlamak

Ubuntu ve Debian'da sistem günlüğü journal'dadır ve kendi sınırı vardır. Hemen yer açmak için:

sudo journalctl --vacuum-size=200M
sudo journalctl --vacuum-time=14d

Kalıcı sınır için /etc/systemd/journald.conf içinde SystemMaxUse=200M yazıp sudo systemctl restart systemd-journald çalıştırın.

logrotate nasıl çalışır?

Paketlerle gelen çoğu servisin (Nginx, Apache, MySQL, rsyslog) kuralı /etc/logrotate.d/ klasöründe hazırdır ve logrotate günde bir kez kendiliğinden çalışır. Mevcut bir kurala bakın:

cat /etc/logrotate.d/nginx

Genellikle şunu görürsünüz: daily (her gün), rotate 14 (14 eski kopya sakla), compress (sıkıştır), missingok (dosya yoksa hata verme) ve postrotate bölümü (döndürmeden sonra servise "günlüğü yeniden aç" demek için).

Kendi uygulamanız için kural yazmak

Örneğin /var/log/uygulamam/*.log dosyalarını haftalık döndürmek için /etc/logrotate.d/uygulamam dosyası oluşturun:

/var/log/uygulamam/*.log {
    weekly
    rotate 8
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
}
  • notifempty: Dosya boşsa döndürme.
  • delaycompress: En son kopyayı bir tur sıkıştırma, programın yazmaya devam etmesi için.
  • copytruncate: Uygulama günlük dosyasını açık tutuyor ve yeniden açmayı bilmiyorsa dosyayı kopyalayıp sıfırlar (kısa bir yazma kaybı riskiyle).

Deneme ve zorlama

sudo logrotate -d /etc/logrotate.d/uygulamam    # sadece ne yapacağını göster
sudo logrotate -f /etc/logrotate.d/uygulamam    # hemen çalıştır

Hatalar genelde yazım ya da izin kaynaklıdır; -d çıktısı nedeni gösterir.

Önemli: günlükleri tamamen kapatmayın

Disk dolmasın diye günlükleri tümden kapatmak, bir sorun çıktığında neyin yanlış gittiğini görememenize yol açar. Saklama süresini kısaltın, kapatmayın. Disk dolduysa genel temizlik için disk doldu, "boş ama dolu" hatası için inode makalesine bakın.

Sık sorulanlar

Dosyayı silsem olmaz mı?

Çalışan bir uygulamanın açık tuttuğu günlüğü silerseniz alan geri verilmez (süreç yazmaya devam eder). Boşaltmak için sudo truncate -s 0 dosya.log kullanın ya da logrotate'e bırakın.

logrotate günde kaçta çalışır?

Ubuntu ve Debian'da bir systemd zamanlayıcısı ya da cron günde bir kez (genellikle sabaha karşı) çalıştırır.

Nginx günlükleri çok büyük, ne yapayım?

Erişim günlüğünü kısıtlamak için gerekmiyorsa access_log off; kullanabilirsiniz; ya da rotate sayısını düşürün. Yanıt vermeyen botları fail2ban ile engellemek de günlüğü azaltır.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.