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

logrotating файлов в каталогах и их подкаталогах

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

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

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

Повернет все .журнал файлы в baseir / а также все .журнал файлы в любом прямом потомке baseir. Если вам также нужно пройти на 1 уровень глубже, просто добавьте еще один /var/log/basedir/*/*/*.log пока вы не пройдете каждый уровень.

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

logrotate -d testconfig.conf

флаг -d перечислит каждый файл журнала, который он рассматривает для ротации.

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

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

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

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

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