WordPress, yazılım ve IT üzerine notlar
Anasayfa » Sunucu & Linux » logrotate ile log dosyalarını yönetmek: Disk dolmadan önce

logrotate ile log dosyalarını yönetmek: Disk dolmadan önce

İçindekiler
  1. Döndürme ne demek?
  2. Nasıl çalışır?
  3. Kendi uygulamanız için kural
  4. En sık yapılan hata: Uygulama eski dosyaya yazmaya devam ediyor
  5. Kuralı test etmek
  6. logrotate çalıştı mı?
  7. systemd journal ayrı yönetilir
  8. Sonuç

Bir sunucuda disk dolmasının en yaygın sebeplerinden biri, kimsenin dönmesini (rotate) ayarlamadığı bir log dosyasıdır. Sistem servislerinin logları genellikle dağıtımla birlikte gelen kurallarla yönetilir. Ama kendi yazdığınız bir uygulamanın, bir betiğin ya da sonradan kurduğunuz bir aracın logları çoğu zaman unutulur.

logrotate, neredeyse her Linux dağıtımında kurulu gelen ve log dosyalarını düzenli olarak döndüren bir araçtır.

Döndürme ne demek?

Bir log dosyası döndürüldüğünde:

  1. Mevcut dosya yeniden adlandırılır: uygulama.log → uygulama.log.1
  2. Bir önceki uygulama.log.1 → uygulama.log.2 olur, ve böyle devam eder.
  3. Uygulama yazmaya devam etmek için yeni ve boş bir uygulama.log kullanır.
  4. Belirlenen sayının ötesindeki eski dosyalar silinir.
  5. İsteğe bağlı olarak eski dosyalar sıkıştırılır: uygulama.log.2.gz

Nasıl çalışır?

logrotate kendi başına sürekli çalışan bir servis değildir. Günde bir kez bir zamanlayıcı (systemd timer ya da cron) tarafından çalıştırılır:

systemctl list-timers | grep logrotate

Kurallar iki yerde durur:

  • /etc/logrotate.conf: Genel varsayılanlar.
  • /etc/logrotate.d/: Her uygulama için ayrı bir dosya. Kendi kurallarınızı buraya ekleyin.

Kendi uygulamanız için kural

/etc/logrotate.d/fatura-uygulamasi:

/var/log/fatura/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 fatura fatura
    su fatura fatura
    postrotate
        systemctl kill -s HUP fatura.service >/dev/null 2>&1 || true
    endscript
}

Satır satır:

  • daily: Her gün döndür. Alternatifleri: weekly, monthly ya da boyuta göre size 100M.
  • rotate 14: Son 14 dosyayı tut, daha eskilerini sil.
  • compress: Eski dosyaları gzip ile sıkıştır. Metin loglar genellikle onda bir boyuta iner.
  • delaycompress: En son döndürülen dosyayı (.log.1) bir sonraki döndürmeye kadar sıkıştırma. Uygulama o dosyaya hâlâ birkaç satır yazıyor olabilir. Ayrıca son günün logunu zcat olmadan okumak kolaylık sağlar.
  • missingok: Dosya yoksa hata verme.
  • notifempty: Dosya boşsa döndürme.
  • create 0640 fatura fatura: Yeni dosyayı bu izinler ve sahiplikle oluştur.
  • su fatura fatura: Döndürme işlemini bu kullanıcıyla yap. Log klasörü root'a ait değilse logrotate bu satırı ister.
  • postrotate ... endscript: Döndürmeden sonra çalışacak komut.

En sık yapılan hata: Uygulama eski dosyaya yazmaya devam ediyor

Uygulama log dosyasını açık tutuyorsa, dosyanın adı değişse bile uygulama aynı dosyaya yazmaya devam eder. Çünkü Linux'ta açık bir dosya, adıyla değil, dosya tanımlayıcısıyla takip edilir. Sonuç: uygulama.log boş kalır, bütün yeni satırlar uygulama.log.1 dosyasına gider. Hatta o dosya sıkıştırılıp silinse bile uygulama silinmiş dosyaya yazmaya devam eder ve disk alanı geri gelmez.

Bunun iki çözümü var:

1. Uygulamaya dosyayı yeniden açmasını söyleyin. Pek çok uygulama ve servis, HUP sinyali aldığında log dosyalarını kapatıp yeniden açar. Nginx için:

postrotate
    [ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript

Nginx USR1 sinyalini log dosyalarını yeniden açmak için kullanır. Kendi uygulamanızın hangi sinyali desteklediğini belgelerinden kontrol edin.

2. copytruncate kullanın. Uygulama sinyal desteklemiyorsa:

copytruncate

Bu seçenek dosyayı yeniden adlandırmak yerine kopyalar ve ardından orijinal dosyayı sıfırlar. Uygulama hiçbir şey fark etmeden aynı dosyaya yazmaya devam eder. Bedeli şudur: Kopyalama ile sıfırlama arasındaki çok kısa sürede yazılan birkaç satır kaybolabilir. Çoğu uygulama için kabul edilebilir bir risktir.

Kuralı test etmek

Kuralı yazdıktan sonra bir gün beklemeyin. Önce deneme modunda çalıştırın:

logrotate -d /etc/logrotate.d/fatura-uygulamasi

-d parametresi hiçbir şeyi değiştirmez, yalnızca ne yapacağını ekrana yazar. Sözdizimi hatası varsa burada görünür. Sonra zorla bir döndürme yaptırın:

logrotate -f /etc/logrotate.d/fatura-uygulamasi
ls -lh /var/log/fatura/

Ve uygulamanın yeni dosyaya yazdığını kontrol edin:

tail -f /var/log/fatura/uygulama.log

logrotate çalıştı mı?

logrotate her dosyanın en son ne zaman döndürüldüğünü bir durum dosyasında tutar:

cat /var/lib/logrotate/logrotate.status      # RHEL / AlmaLinux
cat /var/lib/logrotate/status                # Debian / Ubuntu

Bir dosya hiç döndürülmüyorsa, logrotate'in kendi çıktısına ve sistem günlüğüne bakın:

journalctl -u logrotate --since "2 days ago"

systemd journal ayrı yönetilir

journalctl ile okunan systemd günlükleri logrotate ile değil, journald'ın kendi ayarlarıyla yönetilir. Boyutunu sınırlamak için /etc/systemd/journald.conf içinde:

SystemMaxUse=500M

Ardından systemctl restart systemd-journald.

Sonuç

Sunucuya yeni bir uygulama kurduğunuzda, ilk işlerinizden biri o uygulamanın loglarının nereye yazıldığını bulmak ve bir logrotate kuralı eklemek olsun. Bu beş dakikalık iş, aylar sonra gece yarısı gelen "disk dolu" alarmını önler.

Tezcan Kabakçı
Hosting teknik destek uzmanı ve WordPress uzmanı. 2024'ten beri bir hosting şirketinde teknik destek bölümünde çalışıyor; WordPress, DNS ve e-posta sorunlarını her gün yakından görüyor. YouTube kanalı.
Bu yazı 21 Temmuz 2026 tarihinde Sunucu & Linux kategorisinde yayınlandı.
Yeni yazılar e-postanıza gelsin

Ayda birkaç e-posta; istediğiniz an tek tıkla ayrılabilirsiniz.

Videolu anlatımlar YouTube'da
Sunucu ve WordPress sorunlarını kısa videolarla anlattığım kanala abone olabilirsiniz. ▶ Kanala abone ol

Yorumlar

Henüz yorum yok. İlk yorumu siz yazın.

Yorum yazın

Yorumlar onaylandıktan sonra yayımlanır. Bağlantı içeren yorumlar spam olarak değerlendirilebilir.