Logrotate: Günlük olmayan dosyaları döndürüyor musunuz?


17

Çeşitli dosyaları ve dizinleri sıkıştırır ve .tgz arşivleri oluşturur bir yedekleme komut dosyası var. Dosyalar adlandırılır, örn.

...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz

Bu dosyaları sadece son 5 yedek tutulur, böylece eski dosyalar silinir.

Bunu yapmak için logrotate kullanabilir miyim? Bunlar günlük dosyaları değildir ve zaten sıkıştırılmıştır. Onlar / root içinde ve / var / log içinde değil - yine de kullanabilir miyim?

Teşekkürler

Yanıtlar:


3

Logrotate dosyaları döndürür, bu nedenle cevap evettir - muhtemelen ve yeterli izin yoksa / backup veya başka bir yere yerleştirin. Döndürülen günlüklerin hangi grup ve kullanıcıya sahip olduğunu kontrol edin :-).

Logrotate sıkıştırma için seçenekler vardır, eğer "sıkıştır" konfigüre EDİLMEDİĞİNDE - eğer o zaman denemez. Ayrıca sizin durumunuzda, "5 döndür" seçeneği.

/Etc/logrotate.d dosyasına (veya sisteminizde depolandığı yere) bir göz atın


26

İşleminizde bir değişiklik olmadan, kendi başına logrotate burada aradığınızı yapmayacaktır. Buradaki temel sorun, logrotate joker karakter alabiliyor olsa da, dosyaları bir tane olarak ele almaz ve bunun yerine hepsini tek tek döndürmeye çalışır, ki bu kesinlikle istediğiniz şey değildir.

Bununla birlikte, en son yedek bir tarih damgası olmadan oluşturulduğu sürece, tanımladığınız şekilde çalışmasını sağlayabilirsiniz. /root/backup.tar.gzÖrneğin, yedekleme işlemi oluşturduğunuzda aşağıdaki logrotate yapılandırmasını kullanabilirsiniz:

/root/backup.tar.gz {
    rotate 5
    nocompress
    dateext
    dateformat _%Y-%m-%d
    extension .tar.gz
    missingok
}

Buradaki seçeneklerin hızlı açıklaması:

  • rotate 5 - silmeden önce 5 tur tutun
  • nocompress - Döndürdükten sonra dosyaları sıkıştırmayın
  • dateext - sayıları artırmak yerine tarihi döndürme uzantısı olarak kullanma
  • dateformat _%Y-%m-%d - kullanmak istediğiniz tarih uzantısı biçimini ayarlayın
  • extension .tar.gz- .tar.gzrotasyon uzantısından sonra gelmeyi yapın
  • missingok - döndürmek istediğimiz dosya orada değilse, endişelenmeyin ve devam edin (varsayılan bir hata atmaktır)

Bu yardımcı olur umarım!


1
İyi iş. Bunu okuyarak birkaç şey öğrendim. Yine de şunu eklemek isterim ki, bazı dağıtımlar, özellikle RedHat EL, "Enterprise Ready" olmayan seçenekleri çıkarmaya eğilimlidir, bu yüzden YMMV.
zerolagtime

Bu çözüme göre stackoverflow.com/questions/14858752/… logrotate görevi gerçekleştirebilir.
Pieter

22

Bunu yapmak için logrotate kullanmanız gerekmez. Bunun gibi bir komut kullanmanız yeterlidir:

ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1

Bu komut en son 5 dosyayı bırakır ve kalan dosyaları (varsa) kaldırır. Bir cron işinde kullanabilirsiniz.


ama bu
dönmüyor

Soruya cevap vermiyor.
kubanczyk

4
Soru, en son beş yedeği tutmaktı ve bunun tam olarak yaptığı şeydi. Daha da basit: ls -t1 / root / backup_ * | kuyruk -n +6 | xargs rm -f
yoyoma2

Bu cevap benim sorum. Ne yazık ki orijinal soru Google-fu ile bulabildiğim en yakın soru.
Sukima

0

Sadece aynı durum vardı. Logrotate kulağa hoş geliyor ama veri ve dosya adlarını uyuşturamadığı için benim için% 100 çalışmıyor.

Bu nedenle, karışıklığı önlemek için, son 5 yedeklemeyi tutmak için mevcut yedeklememi oluşturduktan sonra yürütmek için aşağıdaki satırı dahil etmeye karar verdim.

Günlüklerim:

  • sofra kaşığı-BCX-20180308_010501.tar.bz2
  • sofra kaşığı-BCX-20180307_010501.tar.bz2
  • sofra kaşığı-BCX-20180306_010501.tar.bz2

Yedek komut dosyama yeni satır (yukarıdaki yoruma dayanarak)

  • find / BCX / dumpsql / -tipi f | sıralama -r | kuyruk -n +6 | xargs rm

Saygılarımızla,


-1

Manuel olarak döndürebilirsiniz.

rotating_logger()
{

_LOG_FILE_=${1}
_MESSAGE_TO_ECHO_=${2}

_LOG_FILE_BYTES_SIZE_=`wc -c ${_LOG_FILE_} | awk '{print $1}'`

#echo "_LOG_FILE_BYTES_SIZE_ : ${_LOG_FILE_BYTES_SIZE_}"

# in MB
if [ ${_LOG_FILE_BYTES_SIZE_} -gt ${_FILE_SIZE_IN_BYTES_} ] ; then
        #cat /dev/null > ${_LOG_FILE_}
         for (( i=${_LOG_ROTATE_MAX_INDEX_}; i>=1; i-- ))
        do
                 if [ $i -eq ${_LOG_ROTATE_MAX_INDEX_} -a -f ${_LOG_FILE_}.$i ] ; then
                        rm -rf ${_LOG_FILE_}.$i
                 fi

                if [ $i -gt 10 ] ; then
                        rm -rf ${_LOG_FILE_}.10
                elif [ $i -eq 9 -a -f ${_LOG_FILE_}.9 ] ; then
                       mv ${_LOG_FILE_}.9 ${_LOG_FILE_}.10
                elif [ $i -eq 8 -a -f ${_LOG_FILE_}.8 ] ; then
                       mv ${_LOG_FILE_}.8 ${_LOG_FILE_}.9
                elif [ $i -eq 7 -a -f ${_LOG_FILE_}.7 ] ; then
                       mv ${_LOG_FILE_}.7 ${_LOG_FILE_}.8
                elif [ $i -eq 6 -a -f ${_LOG_FILE_}.6 ] ; then
                       mv ${_LOG_FILE_}.6 ${_LOG_FILE_}.7
                elif [ $i -eq 5 -a -f ${_LOG_FILE_}.5 ] ; then
                       mv ${_LOG_FILE_}.5 ${_LOG_FILE_}.6
                elif [ $i -eq 4 -a -f ${_LOG_FILE_}.4  ] ; then
                       mv ${_LOG_FILE_}.4 ${_LOG_FILE_}.5
                elif [ $i -eq 3 -a -f ${_LOG_FILE_}.3  ] ; then
                       mv ${_LOG_FILE_}.3 ${_LOG_FILE_}.4
                elif [ $i -eq 2 -a -f ${_LOG_FILE_}.2  ] ; then
                       mv ${_LOG_FILE_}.2 ${_LOG_FILE_}.3
                elif [ $i -eq 1 -a -f ${_LOG_FILE_}.1 ] ; then
                       mv ${_LOG_FILE_}.1 ${_LOG_FILE_}.2
                fi
        done
        mv ${_LOG_FILE_} ${_LOG_FILE_}.1
        touch ${_LOG_FILE_}
fi

echo `date +%Y-%m-%d:%H:%M:%S` : "${_MESSAGE_TO_ECHO_}" >> ${_LOG_FILE_}
#echo "" >> ${_LOG_FILE_}
}

Şimdi verileri günlüğe koymak için

rotating_logger <file_path> "Welcome world!"

1
Yararlı olmasını istiyorsanız, yazılarınızı biçimlendirmek için biraz çaba harcayabilirsiniz.
Tim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.