İçindekiler
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:
- Mevcut dosya yeniden adlandırılır:
uygulama.log→uygulama.log.1 - Bir önceki
uygulama.log.1→uygulama.log.2olur, ve böyle devam eder. - Uygulama yazmaya devam etmek için yeni ve boş bir
uygulama.logkullanır. - Belirlenen sayının ötesindeki eski dosyalar silinir.
- İ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,monthlyya da boyuta göresize 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 logunuzcatolmadan 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.
Yorumlar
Henüz yorum yok. İlk yorumu siz yazın.