Logrotate komutu /usr/sbin
klasörü altında yer alan bir komuttur. Bu komut ile
- Dosya boyutu belirli bir büyüklüğe ulaştığında log dosyasını rotate(çevrim) etme
- Rotate işleminden sonra yeni log bilgileri için dosya yaratma
- Rotate edilmiş log dosyalarını sıkıştırma
- Eski log dosyalarını kaldırma
- Log dosyalarını tarihe göre saklama
gibi işlemler yapılabilir.
Logrotate komutunun çalışma yapısı aslında cronun çalışma yapısıdır. /etc/cron.daily/logrotate
dizininde günlük olarak çalışan bir shell betiğidir (script).
#!/bin/sh test -x /usr/sbin/logrotate || exit 0 /usr/sbin/logrotate /etc/logrotate.conf EXITVALUE=$? if [ $EXITVALUE != 0 ]; then /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]" fi exit 0
Komutun genel yapısı aşağıdaki gibidir.
logrotate [-dv] [-f|--force] [-s|--state file] config_file
MongoDB log dosyası için bir örnek yapalım
Örneğimizi MongoDB’de yapmamızın nedeni MongoDB’nin logları tek bir dosya üzerinde tutmasıdır. Bizim burada önüne geçmeye çalıştığımız şey bu dosyanın çok fazla büyümesine engel olmak ve çok büyüyen bir dosyanın sistemdeki etkilerinden korunmaktır. Birçok sistemde örneğin PostgreSQL’de rotation (çevrim) PostgreSQL’in kendi yapılandırma dosyasından (postgresql.conf
) ayarlanabilmektedir. MongoDB için biz bunu elle yapacağız.
Logrotate konfigurasyon dosyası /etc
dizini altındaki logrotate.conf
dosyasında yer almaktadır. Bu dosyada utmp ve btmp logları için ayarlar mevcuttur. Bu loglar için sistem ayrı bir konfigurasyona ihtiyaç duymaz.
Aşağıda logrotate.conf
dosyasınının default halini görebilirsiniz.
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # uncomment this if you want your log files compressed #compress # packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp, or btmp -- we'll rotate them here /var/log/wtmp { missingok monthly create 0664 root utmp rotate 1 } /var/log/btmp { missingok monthly 1,1 Top
MongoDB için öncelikle /var/log/mongodb
dizini altındaki log dosyalarını kontrol ediyoruz.
-rw-r--r-- 1 mongodb nogroup 2638 Tem 19 12:07 mongodb.log
Daha sonra /etc/logrotate.d
dizini altında geldiğimizde çeşitli programlar için oluşturulmuş logrotate konfigurasyonlarının yer aldığını görüyoruz.
-rw-r--r-- 1 root root 434 Mar 19 22:57 apache2 -rw-r--r-- 1 root root 126 Eki 11 2013 apport -rw-r--r-- 1 root root 173 Eyl 11 2013 apt -rw-r--r-- 1 root root 430 Eyl 27 2013 cups-daemon -rw-r--r-- 1 root root 232 Eki 4 2013 dpkg -rw-r--r-- 1 root root 164 Tem 20 12:11 mongodb-server * -rw-r--r-- 1 root root 905 Nis 20 18:22 mysql-server -rw-r--r-- 1 root root 173 Ağu 28 2013 postgresql-common -rw-r--r-- 1 root root 94 Oca 23 2013 ppp -rw-r--r-- 1 root root 515 Haz 5 2013 rsyslog -rw-r--r-- 1 root root 513 Ağu 27 2013 speech-dispatcher
Yukarıdaki dosyalar içinde MongoDB için konfigurasyon dosyası yer almıyorsa
touch mongodb
komutu ile konfigurasyon dosyasını oluşturuyoruz.
sudo vim mongodb
ile oluşturduğumuz dosyasıyı açıp rotate işlemi için gerekli parametreleri yazıp kaydediyoruz.
Eğer MongoDB için conf. dosyası varsa parametreleri istediğimiz gibi değiştirerek kullanabiliriz.
Ben aşağıdaki parametreleri kullandım.
/var/log/mongodb/mongodb.log { daily rotate 7 delaycompress compress dateext missingok copytruncate }
Bu ayarlar ile
- mongodb.log dosyası günlük olarak saklanacak
- Eski log dosyaları varsayılan olarak gzip şeklinde tutulacak
- rotate 7 ile son 7 güne ait log dosyaları saklanacak.Bunun için eski log dosyaları tarih sırasına göre silinecek.
Kullandığımız parametreleri açıklayalım.
- daily: Rotate işlemini günlük olarak gerçeleştirir.
- compress: Eski log dosyalarını varsayılan olarak gzip olarak sıkıştırır.
- dateext: Arşivlenen log dosyalarına YYYYMMDD şeklinde tarih formatı ekler.
- missingok: Eğer log dosyası yoksa hata mesajı vermeden bir sonrakine geçer.
- copytruncate: Dosyanın kopyasını aldıktan sonra,dosyanın boyutunu sıfırlamak için silme işlemini gerçekleştirir.
Yapmak istediğimiz işlemlere göre copy, dateformat, create, ifempty, mail, maxsize gibi parametreleri de kullanabiliriz. Parametrelerle ilgili ayrıntılı bilgilere man logrotate
komutu ile ulaşabiliriz.
Ayrıca postrotate/endscript
ifadelerini kullanarak her rotate işleminden sonra yaptırmak istediğimiz işlemleri aşağıdaki gibi yazabiliriz. prerotate/endscript
ise rotate yapmadan önce komutu çalıştırır.
postrotate kill <mongod process id> endscript
sudo logrotate -f /etc/logrotate.d/mongodb
komutunu terminalde çalıştırınca /var/log/mongodb
dizini altında tutulan log dosyasında işlemlerin gerçekleştiğini görüyoruz.
-rw-r--r-- 1 mongodb nogroup 0 Tem 19 12:25 mongodb.log -rw-r--r-- 1 mongodb nogroup 2423 Tem 21 13.00 mongodb.log-20140721 -rw-r--r-- 1 mongodb nogroup 1395 Tem 20 11.56 mongodb.log-20140720.gz
Bu komutu çalıştırmadan da bir sonraki gün rotate işleminin gerçekleştiğini gözlemleyebiliriz. Diğer programlar için de logrotate kullanarak log dosyalarını kontrol altına alabiliriz.
Yararlandığım Kaynaklar
Çok güzel olmuş, teşekkürler… 🙂
Ben teşekkür ederim 🙂