Kafayı yiyecektim dostlar. Geçen hafta sunucu alarm vermeye başladı, disk alanı %99.9! Panikle SSH'ladım, `df -h` yazdım ve gördüğüm manzara karşısında şok oldum. Meğerse, aylardır sorunsuz çalıştığını sandığım o küçük otomasyon botumun log dosyası tam 120 GB yemiş! Şaka gibi ama, tek bir .log dosyasıydı bu. Hiç log rotation ayarlamamışım.
Disk Felaketinin Anatomisi
Olay şu: Uygulama sürekli çalışıyor, her işlem, her hata, her bilgi satır satır aynı dosyaya yazılıyor. Dosya büyüdükçe büyüyor. Sadece yazma işlemi de değil, o devasa dosyayı açıp okumaya çalışmak bile artık bir işkenceye dönüşüyor. Sistem, dosyayı açık tutmak için kaynak tüketiyor. Basit bir `tail -f` komutu bile donuyor.
Kurtuluş Rotasyonu (Log Rotation)
Çözüm, logları belirli bir boyuta veya zamana göre bölmek ve eski olanları sıkıştırıp/arşivleyip silmek. Neyse ki dünyayı yeniden keşfetmeye gerek yok. Linux'ta logrotate diye bir cankurtaran var. Ya da doğrudan kod içinde, Python için RotatingFileHandler, Java için Logback/Log4j gibi kütüphaneler bunun için var.
Örneğin Python'da nasıl yapılır:
Bu ayarla, dosya 5 MB'ı geçince `app.log.1`, `app.log.2.gz` gibi dosyalar oluşacak ve en fazla 5 eski dosya tutulacak. Tertemiz.
Alınacak Sert Ders
Her şeyi logla, evet, ama loglarını kontrol altında tut. "Çalışıyor işte" deyip geçme. Log rotation, production'a çıkmadan önce mutlaka düşünülmesi gereken bir altyapı konusu. Yoksa bir sabah uyanıp sunucunun çöktüğünü görürsün ve sebebi, senin yazdığın masum log satırları olur.
Siz de benim gibi log dosyasıyla sunucunuzu doldurup komik/dramatik anlar yaşadınız mı? Ya da log rotation için farklı, daha şık bir yönteminiz var mı? Aşağıya yazın, konuşalım!
Olay şu: Uygulama sürekli çalışıyor, her işlem, her hata, her bilgi satır satır aynı dosyaya yazılıyor. Dosya büyüdükçe büyüyor. Sadece yazma işlemi de değil, o devasa dosyayı açıp okumaya çalışmak bile artık bir işkenceye dönüşüyor. Sistem, dosyayı açık tutmak için kaynak tüketiyor. Basit bir `tail -f` komutu bile donuyor.
Bash:
ls -lh my_app.log
-rw-r--r-- 1 user user 120G Aug 10 15:30 my_app.log
Çözüm, logları belirli bir boyuta veya zamana göre bölmek ve eski olanları sıkıştırıp/arşivleyip silmek. Neyse ki dünyayı yeniden keşfetmeye gerek yok. Linux'ta logrotate diye bir cankurtaran var. Ya da doğrudan kod içinde, Python için RotatingFileHandler, Java için Logback/Log4j gibi kütüphaneler bunun için var.
Örneğin Python'da nasıl yapılır:
Python:
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=510241024, backupCount=5) # 5 MB, 5 yedek
logger.addHandler(handler)
Bu ayarla, dosya 5 MB'ı geçince `app.log.1`, `app.log.2.gz` gibi dosyalar oluşacak ve en fazla 5 eski dosya tutulacak. Tertemiz.
Her şeyi logla, evet, ama loglarını kontrol altında tut. "Çalışıyor işte" deyip geçme. Log rotation, production'a çıkmadan önce mutlaka düşünülmesi gereken bir altyapı konusu. Yoksa bir sabah uyanıp sunucunun çöktüğünü görürsün ve sebebi, senin yazdığın masum log satırları olur.
Siz de benim gibi log dosyasıyla sunucunuzu doldurup komik/dramatik anlar yaşadınız mı? Ya da log rotation için farklı, daha şık bir yönteminiz var mı? Aşağıya yazın, konuşalım!