Logrotate: вращение файлов без регистрации?


17

У меня есть скрипт резервного копирования, который сжимает различные файлы и каталоги и создает архивы .tgz. Файлы названы, например

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

Я хочу управлять этими файлами, чтобы сохранить только последние 5 резервных копий, а старые файлы были удалены.

Могу ли я использовать logrotate для этого? Они не являются лог-файлами и уже сжаты. Они находятся в / root, а не в / var / log - могу ли я его использовать?

Благодарность

Ответы:


3

Logrotate вращает файлы, поэтому ответ - да, возможно, и если нет достаточных разрешений, поместите их в / backup или что-то в этом роде. Проверьте, какую группу и пользователя имеют повернутые логи :-).

В logrotate есть опции для сжатия, так что, если «сжатие» НЕ настроено - тогда он не будет пытаться. Также в вашем случае опция «повернуть на 5».

Посмотрите в /etc/logrotate.d (или где он хранится в вашей системе)


26

Без изменения вашего процесса, logrotate сам по себе не будет делать то, что вы ищете здесь. Ключевая проблема здесь заключается в том, что, хотя logrotate может использовать подстановочные знаки, он не будет обрабатывать файлы как один, если вы это сделаете, и вместо этого попытается повернуть их все по отдельности, что, безусловно, НЕ то, что вам нужно.

Однако вы можете заставить его работать так, как вы описываете, при условии, что самая последняя резервная копия создается без отметки даты. Если вы создаете, /root/backup.tar.gzнапример, процесс резервного копирования , вы можете использовать следующую конфигурацию logrotate:

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

Краткое описание вариантов здесь:

  • rotate 5 - сохраняйте 5 вращений перед удалением
  • nocompress - не сжимайте файлы после вращения
  • dateext - использовать дату как расширение ротации вместо увеличения чисел
  • dateformat _%Y-%m-%d - установить формат расширения даты, который вы хотите использовать
  • extension .tar.gz- .tar.gzприехать после продления вращения
  • missingok - если файл, который мы хотим повернуть, отсутствует, не беспокойтесь об этом и двигайтесь дальше (по умолчанию выбрасывается ошибка)

Надеюсь это поможет!


1
Хорошо сделано. Я узнал несколько вещей, прочитав это. Однако я хочу добавить, что некоторые дистрибутивы, в частности RedHat EL, имеют тенденцию отбрасывать опции, которые не «Enterprise Ready», поэтому YMMV.
zerolagtime

Согласно этому решению stackoverflow.com/questions/14858752/… logrotate может выполнить задачу.
Питер

22

Вам не нужно использовать logrotate, чтобы сделать это. Просто используйте команду как это:

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

Эта команда оставит последние 5 файлов и удалит оставшиеся (если есть). Вы можете использовать его в работе cron.


но это не вращается ....
simpleuser

Не отвечает на вопрос.
kubanczyk

4
Вопрос состоял в том, чтобы сохранить пять самых последних резервных копий, и это делает именно это. Еще проще: ls -t1 / root / backup_ * | хвост -n +6 | xargs rm -f
yoyoma2

Это ответило на мой вопрос. К сожалению, оригинальный вопрос был самым близким, который я мог найти с Google-фу.
Sukima

0

У меня просто была такая же ситуация. Logrotate звучит довольно круто, но он не работает для меня на 100%, потому что он не соответствует данным и именам файлов.

Поэтому, чтобы избежать путаницы, я решил добавить следующую строку для выполнения после создания моей текущей резервной копии, чтобы сохранить последние 5 резервных копий.

Мои журналы:

  • TBL-BCX-20180308_010501.tar.bz2
  • TBL-BCX-20180307_010501.tar.bz2
  • TBL-BCX-20180306_010501.tar.bz2

Новая строка в моем резервном скрипте (на основе комментария выше)

  • find / BCX / dumpsql / -type f | сортировать -r | хвост -n +6 | XARGS RM

С Уважением,


-1

Вы можете повернуть его вручную.

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

Теперь, чтобы поместить данные в журнал, просто сделайте

rotating_logger <file_path> "Welcome world!"

1
Возможно, вы могли бы приложить немного усилий для форматирования вашего сообщения, если вы хотите, чтобы оно было полезным.
Тим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.