Логротировать файлы в каталогах и их подкаталогах
Можно ли получить logrotate
рассмотреть лог-файлы в каталоге и всех его подкаталогах? (т.е. без явного перечисления подкаталогов.)
4 ответа
Насколько глубоки ваши подкаталоги?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
Повернет все файлы .log в basedir/, а также все файлы .log в любом прямом дочернем элементе basedir. Если вам также нужно пройти 1 уровень глубже, просто добавьте еще один /var/log/basedir/*/*/*.log
пока вы не пройдете каждый уровень.
Это можно проверить с помощью отдельного файла конфигурации logrotate, который содержит ограничение, которое не будет выполнено (высокий минимальный размер), а затем запустив log rotate себя в подробном режиме.
logrotate -d testconfig.conf
флаг -d перечислит каждый файл журнала, который он хочет повернуть.
Это старый поток, но вы можете сделать следующее:
/var/log/basedir/**/*.log {
daily
rotate 5
}
Эти две звезды будут соответствовать нулю или более каталогов. Вы должны быть осторожны, как вы определяете файлы журналов, которые должны быть повернуты, потому что вы можете вращать файлы, которые уже были повернуты. Я приведу здесь руководство по logrotate.
Пожалуйста, используйте подстановочные знаки с осторожностью. Если вы укажете *, logrotate будет вращать все файлы, включая ранее повернутые. Чтобы обойти это, используйте директиву olddir или более точный подстановочный знак (такой как *.log).
В моем случае глубина подкаталогов может меняться без предупреждения, поэтому я настроил скрипт bash, чтобы найти все подкаталоги и создать запись конфигурации для каждого каталога.
Для меня также важно сохранить структуру подкаталогов после ротации, чего, похоже, не было с подстановочными знаками (т. Е. Ответ @DanR). Если вы делаете ежедневные ротации журналов, вы можете поместить этот скрипт в ежедневную работу cron.
basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents
subfolders = $(find ${basedir} -type d)
for ii in ${subfolders}
do
jj=${ii:${#basedir}} #strip off basedir, jj is the relative path
#append new entry to config_file
echo "${basedir}${jj}/* {
olddir ${destdir}${jj}/
daily
rotate 5
}" >> ${config_file}
#add one line as spacing between entries
echo "\n" >> ${config_file}
#create destination folder, if it doesn't exist
[ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done
Как предложено @DanR, протестируйте с logrotate -d
Потратил несколько проб и ошибок, но, наконец, мой шаблон с подстановочными знаками заработал, поскольку у меня есть файлы журналов в одной папке, за которыми следует IP, затем имя хоста, а затем фактическая папка журнала.
У меня есть второй жесткий диск в качестве виртуальной машины, поэтому я указал журналы для использования этого пути:
/mnt/logs/var/log/remotes/10.4.11.12/pve2-test
У меня есть несколько удаленных серверов, перечисленных в папке удаленных компьютеров, за которыми следует имя хоста в отдельной папке. Я не хотел менять эту структуру, поэтому придумал, как использовать подстановочный знак, который действительно работает.
/mnt/logs/var/log/remotes/1*/**/*.log
Я пробовал /mnt/logs/var/log/remotes/** /** /*.log, но это не сработало. Я предполагаю, потому что я пытался сделать полный подстановочный знак, за которым следовал еще один полный подстановочный знак, что ему не понравилось. (Прошу прощения за лишние пробелы в подстановочном знаке, поскольку он был обрезан при редактировании??)
Надеюсь это поможет.