Как сжать логи, созданные rotatelogs

Я использую rotatelogs для создания моих ежедневных журналов apache в формате host.<day>.<month>.<year>.access.log, Теперь я хочу gzip и переместить журнал в другой каталог после его завершения. Как это сделать?

Обновление: произошла небольшая ошибка. logrotate -> rotatelogs

5 ответов

Решение

Я придумал следующий скрипт

#!/bin/sh
for file in $(ls /var/log/apache2/*.$(date +"%y.%m.%d" --date="1 day ago").access.log); do
    gzip $file
    mv $file.gz /var/log/apache2/archive
done;

И после записи cron

15 0    0 0 0   root    /mypath/myscript.sh

Вы можете использовать опцию rotatelogs -p, чтобы использовать программу для сжатия журнала после ротации. (См. Для справки: https://httpd.apache.org/docs/2.4/programs/rotatelogs.html).

программа

Если задано, rotatelogs будет выполнять указанную программу каждый раз, когда открывается новый файл журнала. Имя файла вновь открытого файла передается программе в качестве первого аргумента. При выполнении после поворота старый файл журнала передается в качестве второго аргумента. rotatelogs не ожидает завершения указанной программы перед продолжением работы и не регистрирует любой код ошибки, возвращенный при завершении. Порожденная программа использует те же stdin, stdout и stderr, что и сама rotatelogs, а также наследует среду.

Пример:

CustomLog "|bin/rotatelogs -p '/path/to/compress.sh' -l /var/log/logfile.%Y.%m.%d 86400"

compress.sh:

#!/bin/bash
file_to_compress="${2}"
compress_exit_code=0

if [[ "${file_to_compress}" ]]; then
    echo "Compressing ${file_to_compress} ..."
    tar --gzip --create --file "${file_to_compress}.tar.gz" "${file_to_compress}"

    compress_exit_code=${?}

    if [[ ${compress_exit_code} == 0 ]]; then
        echo "File ${file_to_compress} was compressed."
    else
        echo "Error compressing file ${file_to_compress} (tar exit code: ${compress_exit_code})."
    fi
fi

exit ${compress_exit_code}

Logrotate с радостью сделает компрессию для вас. Просто добавь:

compress

В конфиг logrotate для apache. Есть также аккуратная опция, которая задерживает сжатие на один день:

delaycompress

Что касается их перемещения, logrotate не может вам помочь, но работа cron такая:

@daily mv /var/log/apache/*.gz /var/log/archive/
CustomLog "|/opt/IHS/bin/rotatelogs -l /some/path/access_log.%Y.%m.%d 86400" common | gzip -9 /some/path/access_log.`date '+%Y.%m.%d'`

Я использую find и crontab для достижения этой цели

# crontab -e

5 0 * * * /bin/find /path/to/logs/* -type f \( -mtime 1! -Name "."!-Name ".gz" \) -print0 | xargs -0 gzip> / dev / null 2> & 1;

-mtime n Данные файла были последний раз изменены *24 часа назад.

! -name "не". * "скрытые файлы

! -name "не".gz "файлы, которые уже должны быть сжаты

-print0 & -0 чтобы обеспечить правильную передачу пробелов или специальных символов в xargs -> gzip (для безопасности имени файла)

find -exec может быть использован, но есть недостатки, где | xargs более стабильный

Другие вопросы по тегам