Logrotate: Memutar file non-log?

17

Saya memiliki skrip cadangan yang memampatkan berbagai file dan direktori dan membuat arsip .tgz. File diberi nama, mis

...
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

Saya ingin mengelola file-file ini sehingga hanya 5 backup terakhir yang disimpan, dengan file yang lebih lama dihapus.

Bisakah saya menggunakan logrotate untuk melakukan ini? Mereka bukan file log dan sudah dikompresi. Mereka ada di / root dan bukan di / var / log - bisakah saya tetap menggunakannya?

Terima kasih

jen
sumber

Jawaban:

3

Logrotate memutar file, jadi jawabannya adalah ya - mungkin, dan jika tidak ada izin yang memadai maka letakkan di / backup atau apalah. Periksa grup dan pengguna apa yang dimiliki oleh rotated log :-).

Ada opsi untuk kompresi di logrotate, tetapi jika "kompres" TIDAK dikonfigurasikan - maka itu tidak akan mencoba. Juga dalam kasus Anda, opsi "rotate 5".

Lihatlah /etc/logrotate.d (atau di mana pun itu disimpan di sistem Anda)

3 bulan
sumber
26

Tanpa perubahan pada proses Anda, logrotate dengan sendirinya tidak akan melakukan apa yang Anda cari di sini. Masalah utama di sini adalah, sementara logrotate dapat mengambil wildcard, itu tidak akan memperlakukan file sebagai satu jika Anda melakukannya dan sebaliknya akan mencoba untuk memutar semuanya secara individual, yang jelas BUKAN apa yang Anda inginkan.

Namun, Anda dapat membuatnya berfungsi seperti yang Anda gambarkan selama cadangan terbaru dibuat tanpa cap tanggal. Jika Anda membuat cadangan proses /root/backup.tar.gzmisalnya, Anda dapat menggunakan konfigurasi logrotate berikut:

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

Ikhtisar cepat opsi di sini:

  • rotate 5 - pertahankan 5 rotasi sebelum menghapus
  • nocompress - jangan kompres file setelah diputar
  • dateext - gunakan tanggal sebagai ekstensi rotasi alih-alih angka yang bertambah
  • dateformat _%Y-%m-%d - mengatur format ekstensi tanggal yang ingin Anda gunakan
  • extension .tar.gz- buat yang .tar.gzdatang setelah ekstensi rotasi
  • missingok - jika file yang ingin kita putar tidak ada, jangan khawatir dan lanjutkan (defaultnya adalah membuang kesalahan)

Semoga ini membantu!

menandai
sumber
1
Kerja bagus. Saya belajar beberapa hal dengan membaca ini. Saya ingin menambahkan, bahwa beberapa distribusi, terutama RedHat EL, cenderung menghapus opsi yang tidak "Enterprise Ready," begitu YMMV.
zerolagtime
Menurut solusi ini stackoverflow.com/questions/14858752/… logrotate dapat menyelesaikan tugas.
Pieter
22

Anda tidak harus menggunakan logrotate untuk melakukannya. Cukup gunakan perintah seperti ini:

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

Perintah ini akan meninggalkan 5 file terbaru dan menghapus sisanya (jika ada). Anda bisa menggunakannya dalam pekerjaan cron.

Khaled
sumber
tapi ini tidak berputar ....
simpleuser
Tidak menjawab pertanyaan.
kubanczyk
4
Pertanyaannya adalah untuk menyimpan lima cadangan terbaru dan ini tidak persis seperti itu. Lebih sederhana: ls -t1 / root / backup_ * | tail -n +6 | xargs rm -f
yoyoma2
Ini menjawab pertanyaan saya . Sayangnya pertanyaan aslinya adalah yang paling dekat yang bisa saya temukan dengan Google-fu.
Sukima
0

Saya baru saja mengalami situasi yang sama. Logrotate kedengarannya sangat keren tetapi tidak berhasil bagi saya pada 100% karena tidak cocok data dan nama file.

Jadi, untuk menghindari kebingungan, saya memutuskan untuk memasukkan baris berikut untuk dieksekusi setelah membuat cadangan saya saat ini untuk menjaga 5 cadangan terakhir.

Log saya adalah:

  • tbl-bcx-20180308_010501.tar.bz2
  • tbl-bcx-20180307_010501.tar.bz2
  • tbl-bcx-20180306_010501.tar.bz2

Baris baru ke skrip cadangan saya (berdasarkan komentar di atas)

  • find / BCX / dumpsql / -type f | sort -r | tail -n +6 | xargs rm

Salam,

200313
sumber
-1

Anda dapat memutarnya secara manual.

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_}
}

Sekarang untuk memasukkan data ke log, lakukan saja

rotating_logger <file_path> "Welcome world!"
Krrish Krrish
sumber
1
Mungkin Anda bisa sedikit berusaha memformat posting Anda, jika Anda ingin itu berguna.
Tim