логротування файлів у каталогах та його підкаталогах


62

Чи можна взяти logrotateдо уваги журнали в каталозі та всіх його підкаталогах? (тобто без явного переліку підкаталогів.)

Відповіді:


87

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

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

Повертає всі .log файли в basicir /, а також усі .log файли в будь-якому прямому дочірнім файлі basicir. Якщо вам також потрібно зайти на 1 рівень глибше, просто додайте ще один, /var/log/basedir/*/*/*.logдоки кожен рівень не буде покритий.

Це можна перевірити, скориставшись окремим файлом конфігурації logrotate, який містить обмеження, яке не буде дотримано (високий розмір), а потім запущений журнал обертається самостійно у багатослівному режимі

logrotate -d testconfig.conf

прапор -d перелічить кожен файл журналу, який він планує обертати.


6
Дякую! Схоже, -dпереводить логротат в режим сухого запуску (тобто насправді нічого не змінює).
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


1

Це стара нитка, але ви можете зробити наступне:

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

Ці дві зірки будуть відповідати нулю або більше каталогів. Ти повинен бути обережним, як ви визначаєте файли журналів, які слід обертати, оскільки ви можете обертати файли, які вже обертаються. Я цитую тут посібник з логротату.

Будьте обережні. Якщо ви вказали *, logrotate буде обертати всі файли, включаючи раніше обернені файли. Шляхом цього є використання директиви olddir або більш точного шаблону (наприклад, * .log).


3
цей шаблон підстановки не працював для мене. Логротете 3.8.6 на RHEL 7.3
північний

Можливо, слід активувати, globstarперш ніж запустити логротат. Це ввімкне це для баш shopt -s globstar.
bat_ventzi

У мене така ж проблема. Logrotate 3.8.7 на Ubuntu 16.04.3. ls /var/log/basedir/**/*.log працює як описано, але логротат не робить.
frogstarr78

також не працює для мене, на logrotate 3.11.0. Я не думаю, що розширення bash не має нічого спільного з логрататними підстановками. (крім подібного синтаксису)
Thayne
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.