Назад | Перейти на главную страницу

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

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

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

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

-p программа

Если задано, 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}

Я придумал следующий сценарий

#!/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

Logrotate с радостью выполнит сжатие за вас. Просто добавь:

compress

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

delaycompress

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

@daily mv /var/log/apache/*.gz /var/log/archive/

Я использую find и crontab для этого

# crontab -e

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

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

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

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

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

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

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'`