Как сжать логи, созданные 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
более стабильный