Я использую 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'`