логротировать файлы в каталогах и их подкаталогах

62

Можно ли заставить logrotateрассматривать файлы журналов в каталоге и во всех его подкаталогах? (т.е. без явного перечисления подкаталогов.)

ithinkihaveacat
источник

Ответы:

87

Насколько глубоки ваши подкаталоги?

/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 перечислит каждый файл журнала, который он хочет повернуть.

Дэн Р
источник
6
Спасибо! Похоже, -dпереводит logrotate в режим пробного запуска (то есть фактически ничего не меняет).
ithinkihaveacat
1
Не совсем актуально, но, вероятно, полезно кому-то. -fопция говорит LogRotate к «силе бежать». голое слово в конце команды - это файл конфигурации, который используется вместо стандартного. так logrotate -f /some/configозначает запуск с этим файлом конфигурации, и всегда выполняется, даже если файл конфигурации говорит, что еще не время запускать. На мой неподготовленный взгляд и моему предшественнику, который этим занялся, мне показалось, что -fон просто указывает конфигурационный файл. Весьма запутанно.
Дэн Притц
4

В моем случае глубина подкаталогов может меняться без предупреждения, поэтому я настроил скрипт 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

craq
источник
1

Это старый поток, но вы можете сделать следующее:

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

Эти две звезды будут соответствовать нулю или более каталогов. Однако вы должны быть осторожны с тем, как определять файлы журналов для поворота, поскольку вы можете вращать файлы, которые уже были повернуты. Я процитирую здесь руководство по logrotate.

Пожалуйста, используйте подстановочные знаки с осторожностью. Если вы укажете *, logrotate будет вращать все файлы, включая ранее повернутые. Чтобы обойти это, используйте директиву olddir или более точный подстановочный знак (такой как * .log).

bat_ventzi
источник
3
этот шаблон не работал для меня. Logrotate 3.8.6 на RHEL 7.3
Northben
Может быть, вы должны включить globstarперед запуском logrotate. Это включит его для bash shopt -s globstar.
bat_ventzi
У меня точно такая же проблема. Logrotate 3.8.7 в Ubuntu 16.04.3. ls /var/log/basedir/**/*.log работает, как описано, но logrotate - нет.
frogstarr78
у меня тоже не работает, на logrotate 3.11.0. Я не думаю, что расширение bash имеет какое-либо отношение к групповым символам logrotate. (кроме аналогичного синтаксиса)
Тейн