Sunucuda Log Rotation Rehberi: Disk Dolmasını Önleyin
Disk dolmasını engellemek için log rotation (logrotate), saklama süreleri, sıkıştırma ve kritik dizin kontrollerini net adımlarla anlatıyoruz.
Sunucuda en sık yaşanan arızalardan biri “disk doldu” durumudur. Bu çoğu zaman uygulama hatası değil, arka planda biriken logların kontrolsüz büyümesidir. Log rotation (log döndürme) doğru ayarlanmadığında; web sunucusu (Nginx/Apache), uygulama servisleri, veritabanı veya sistem günlükleri saniyeler içinde disk tüketebilir. Bu rehberde log rotation stratejisini disk kapasitesiyle eşleştirerek nasıl kuracağınızı, hangi log türlerinde hangi politikayı kullandığınızı ve kontrol adımlarını net bir şekilde öğreneceksiniz.
Log rotation neden disk dolmasını engeller?
Log rotation; belirli aralıklarla log dosyasını yeniden adlandırıp yeni log üretmeye, eski logları sıkıştırmaya (compress) ve gerekirse silmeye (prune) dayanır. Böylece disk, zaman içinde sınırsız büyüyen tek bir dosya yerine planlı bir “kayıt penceresi” tutar.
Logların büyümesini tetikleyen örnekler: - Trafik artışı (özellikle access log) - Hata fırtınası (4xx/5xx patlaması) - Yanlış ayarlı debug log (çoğu sistemde debug seviyesinde log yazımı performansı da düşürür) - Uygulamanın günlükleri aynı dosyaya sonsuz eklemesi - Çok büyük core dump / stack trace çıktıların loga düşmesi
Hangi loglar önceliklidir? (Önce doğru hedefi seçin)
Her log dosyası için aynı politika çalışmaz. Önce hangi logların hızlı büyüdüğünü saptayın. Aşağıdaki liste, tipik bir Linux sunucuda öncelikli hedefleri gösterir:
- /var/log/nginx/access.log: Trafiğe bağlı hızlı büyür.
- /var/log/nginx/error.log veya Apache error log: Hata durumlarında hızlı büyür.
- Uygulama logları: Örn. /var/log/myapp/*.log ya da systemd journal dışarı aktarımları.
- /var/log/syslog ve /var/log/messages: Sistem olayları birikir.
- Veritabanı logları: Örn. MySQL/MariaDB için /var/log/mysql/error.log ve yavaş sorgu logları.
- Denetim ve güvenlik logları: Fail2ban kayıtları, auth.log.
Hızlı tespit komutu: “Kim büyüyor?”
Aşağıdaki yaklaşım, log rotation yapmadan önce hedefleri netleştirir:
- Sunucuda en büyük log dosyalarını bulma:
- sudo du -ah /var/log | sort -rh | head -n 30
- En çok yazanları yaklaşık görme (dosya başına büyüme):
- sudo find /var/log -type f -size +100M -exec ls -lh {} \;
Bu listeyi yaptıktan sonra, rotation ayarlarını sadece “kontrolsüz büyüyen” dosyalara yoğunlaştırmak daha doğru sonuç verir.
Log rotation stratejisinin temel parametreleri
Logrotate (log rotation aracı) genelde şu parametrelerle çalışır. Hedefiniz disk dolmasını engellemek olduğundan her parametreyi disk tüketimine bağlayın.
Saklama (retention) süresi: Disk penceresi
Temel karar: “Kaç günlük log saklayacağım?” - Erişim logu (access): 3–14 gün genelde yeterlidir. Daha uzun süre gerekiyorsa arşivleme (S3/obj storage) düşünün. - Hata logu (error): 7–30 gün arası daha yaygındır; ancak hata fırtınasında çok hızlı şişebileceği için boyut sınırı da düşünülür. - Sistem logu (syslog/messages): 7–30 gün.
Diski hesaplayarak karar vermek için basit formül: - Günlük ortalama log boyutu × saklama gün sayısı ≈ disk ihtiyacı
Örnek hesap (yaklaşık): - Nginx access log: günlük 20 GB - Saklama: 7 gün - Sadece access için: 140 GB Bu rakamın disk kotanızın (ör. 200 GB) dışında kalması disk dolmasına doğrudan yol açar.
Sıkıştırma: gzip ile disk düşürme
- Logrotate içinde
compresskullanımı yaygındır. - İyi pratik: access log gibi hacimli dosyalarda sıkıştırma şarttır.
“Yeni dosya oluştur” zamanlaması
daily,weeklygibi periyotlar kullanılabilir.- Trafik çok yüksekse günlük yerine daha sık dönüş (ör. hourly) gerekebilir.
Silme (prune) ve “sınırlı sayıda eski dosya”
rotate N: En fazla N adet eski log dosyası tutulur.- Saklama ihtiyacınız “gün” değil “adet” olarak düşünülüyorsa N üzerinden netleşir.
Örnek: - daily rotation + rotate 14 ⇒ yaklaşık 14 gün
Net bir yapı: /etc/logrotate.d ile düzen kurun
Birçok dağıtımda logrotate için ana yapı /etc/logrotate.conf ve dosya başına ayarların bulunduğu /etc/logrotate.d altında yönetilir. Kural olarak: - Dağıtımın varsayımlarını değiştirmek yerine, ayrı bir dosya ile kendi ayarlarınızı ekleyin.
Örnek: Nginx access log rotation
Aşağıdaki örnek; günlük dönüş, sıkıştırma ve 14 adet eski dosya mantığı kurar. Sunucunuzda dosya yolları farklıysa buna göre uyarlayın.
# /etc/logrotate.d/nginx
/var/log/nginx/access.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
copytruncate
}
Bu örnekte önemli noktalar:
- delaycompress: Son dönen dosyayı hemen sıkıştırmak yerine bir sonraki döngüde sıkıştırır. Bazı servislerin dosya açık tutması durumunda daha stabil çalışır.
- notifempty: Boş dosya için gereksiz işlem yapılmasını azaltır.
- copytruncate: Nginx dosyayı açık tutuyorsa pratik bir yaklaşımdır. (Servisin reopen/pid davranışına göre farklı yöntemler tercih edilebilir.)
Örnek: Nginx error log rotation
Hata logu daha az hacimli olabilir ama hata patlamalarında çok büyüyebilir. Bu yüzden rotate sayısını ve/veya sıkıştırmayı koruyun.
# /etc/logrotate.d/nginx_error
/var/log/nginx/error.log {
daily
rotate 21
compress
delaycompress
missingok
notifempty
}
Uygulama logları için net kontrol: “log nerede bitiyor?”
Uygulama logları bazen: - Dosya olarak yazılır (ör. /var/log/myapp/app.log) - systemd journal üzerinden tutulur - container (Docker) log driver üzerinden tutulur
Dosyaya yazmıyorsa dosya temelli logrotate işe yaramaz. Bu durumda çözüm: - Uygulama loglarını dosyaya yönlendirmek (varsa) - ya da systemd journal için ayrı retention ayarı kullanmak (journalctl/Storage ayarları)
Disk dolmasını engellemek için hesap + doğrulama yöntemi
Log rotation ayarını yaptıktan sonra, “gerçekten disk tüketimi duruyor mu?” sorusunun cevabını doğrulamak gerekir.
1) Logrotate çalışıyor mu?
Komutla test:
- sudo logrotate -f /etc/logrotate.conf
Varsayılan yapı, tüm dahil edilen dosyaları uygular. Belirli bir dosyayı çalıştırmak için ilgili dosyayı hedefleyin.
2) logrotate timer/cron aktif mi?
Dağıtıma göre: - cron: /etc/cron.daily/logrotate - systemd timer: logrotate.service/logrotate.timer
Kontrol:
- systemctl status logrotate.timer 2>/dev/null || true
- systemctl status cron 2>/dev/null || true
3) Disk büyümesi gerçekten yavaşladı mı?
Aşağıdaki kontrol, “rotation var ama pratikte disk temizlenmiyor” durumlarını yakalar:
- log dizin boyutu trendi:
- du -sh /var/log
- belli bir dosyanın boyutu:
- ls -lh /var/log/nginx/access.log
Doğru kurulumda: - Aktif log dosyası boyutu belirli bir aralıkta kalır. - Eski loglar .gz olarak artar, ancak rotate N ile bir süre sonra silinmeye başlar.
Log rotation tek başına yetmez: en sık kaçırılan 3 nokta
1) Servis dosyayı açık tutuyor (copytruncate veya reopen gerekiyor)
Bazı servisler logrotate sonrası yeni log dosyasına geçişi otomatik yapmayabilir. Sonuç: rotation var ama disk aynı dosyanın büyümesiyle şişmeye devam eder.
Çözüm yaklaşımı: - servis için uygun sinyal/yeniden açma (ör. Nginx için reload mantığı) - logrotate parametrelerini servis davranışına göre seçme (copytruncate / create ile izin yönetimi)
2) Container logları ayrı yönetiliyor
Docker/Podman logları dosya olarak /var/lib/docker/… altında büyüyebilir. Bu durumda /var/log/nginx gibi hedefler tek başına sorunu çözmez.
Kontrol için:
- Docker disk ve log sürücüsü:
- docker info --format '{{.Driver}}'
- container log miktarı (yaklaşık):
- docker system df
3) “Sıkışıyor ama silinmiyor” problemi
Sıkıştırma (compress) tek başına disk dolmasını durdurmaz. Eski log dosyalarının rotate N ile veya prune mekanizmasıyla silinmesi gerekir.
Parametreleri disk kapasitesiyle eşleştiren net karar tablosu
Aşağıdaki tablo, yaygın senaryolarda disk dolmasını engellemek için nasıl seçim yapmanız gerektiğini özetler.
| Log türü | Tipik büyüme | Önerilen periyot | rotate/retention hedefi | Ek ayar | Net amaç |
|---|---|---|---|---|---|
| Nginx access.log | Çok hızlı | günlük | 7–14 gün | compress + delaycompress | Trafik büyümesini kontrol etmek |
| Nginx error.log | Değişken | günlük | 14–21 gün | compress | Hata analizi için pencere |
| syslog/messages | orta | günlük/haftalık | 14–30 gün | notifempty | Sistem olaylarını tutmak |
| Uygulama logları | değişken | günlük | 7–14 gün | servis davranışına göre copytruncate | Uygulama hatalarını izlemek |
“Disk dolmasın” hedefi için gerçekçi bir kontrol listesi
Kurulumdan sonra şu kontrol listesini uygulayın:
- [ ]
du -sh /var/logdeğeri büyümesini durdurdu mu (1-3 gün izleyin)? - [ ]
logrotate -f /etc/logrotate.confile testte hata çıkıyor mu? - [ ]
rotate Nile eski loglar gerçekten siliniyor mu? (eski .gz sayısını gözlemleyin) - [ ] log dosya izinleri (create/ownership) servis tarafından yazılabilir durumda mı?
- [ ] Nginx/Apache reload sonrası yeni loga yazım başladı mı? (aktif log dosyası büyüyor mu?)
Sonuç: Log rotation’ı “disk hesabı + doğrulama” ile kurun
Disk dolması sorununu kalıcı şekilde çözmek için log rotation sadece “bir config eklemek” değildir; saklama penceresini disk kapasitenize göre belirleyip sıkıştırma ve silme mantığını aynı anda çalıştırmanız gerekir. İlk adım olarak /var/log içinde en çok büyüyen 3 dosyayı bulun, ardından günlük/haftalık dönüş ve rotate değerlerini disk hesabıyla eşleştirin. Ayarları yaptıktan sonra logrotate -f ile test edin ve 1-3 gün boyunca /var/log toplam boyut trendini izleyin. Bu kontrolü kurduğunuzda disk dolması kaynaklı servis kesintisi riski belirgin biçimde düşer.
Hosting karşılaştırması yapmaya hazır mısın?
100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.
Hosting Karşılaştır →İlgili Yazılar
Site Taşıma Sonrası SEO Çöküşü Nasıl Önlenir? Net Kontrol Planı
Site taşımadan sonra trafik düşüşünü önlemek için yönlendirme, canonical, sitemap, hız ve indeks kontrol adımlarını net bir planla öğrenin.
Forex EA için VDS: Broker yakınlığı neden kritik?
Forex EA için VDS seçerken broker yakınlığının etkisini öğrenin: ping, gecikme, routing ve veri merkezlerini net karşılaştırın.
E-ticarette PCI-DSS uyumluluğu: Kart bilgisi yönetimi rehberi
E-ticarette kart bilgisini nasıl saklamalısınız? PCI-DSS kapsamını azaltmak, token kullanmak ve güvenli akış kurmak için net kontrol listesi.
IPMI / iLO / iDRAC: Uzaktan Sunucu Yönetimi Rehberi
IPMI, iLO ve iDRAC farklarını; KVM/serial-over-LAN, güvenlik, ağ planı ve pratik kontrol listesiyle uzaktan yönetimi netleştirin.
