logrotowanie plików w katalogach i ich podkatalogach

62

Czy można wziąć logrotatepod uwagę pliki dziennika w katalogu i wszystkich jego podkatalogach? (tzn. bez wyraźnego wyświetlania podkatalogów).

ithinkihaveacat
źródło

Odpowiedzi:

87

Jak głęboko sięgają twoje podkatalogi?

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

Obróci wszystkie pliki .log w pliku basedir /, a także wszystkie pliki .log w dowolnym bezpośrednim potomku pliku basedir. Jeśli musisz zejść o 1 poziom głębiej, po prostu dodaj kolejny, /var/log/basedir/*/*/*.logdopóki nie pokryjesz każdego poziomu.

Można to przetestować, używając osobnego pliku konfiguracyjnego logrotate, który zawiera ograniczenie, które nie zostanie spełnione (duży rozmiar minimalny), a następnie uruchomione obracanie dziennika w trybie pełnym

logrotate -d testconfig.conf

-d wyświetli listę każdego pliku dziennika, który zamierza obrócić.

Dan R.
źródło
6
Dzięki! Wygląda na -dto, że faktycznie wprowadza logrotate w tryb pracy na sucho (tzn. Nic nie zmienia).
ithinkihaveacat
1
Nie bardzo bezpośrednio, ale prawdopodobnie przydatne dla kogoś. -fopcja mówi logrotate do „run siły”. puste słowo na końcu polecenia to plik konfiguracyjny, który należy użyć zamiast domyślnego. logrotate -f /some/configoznacza to, że uruchom z tym plikiem konfiguracyjnym i zawsze uruchamiaj, nawet jeśli plik konfiguracyjny mówi, że jeszcze nie czas na uruchomienie. Moim niedoświadczonym oczom i mojemu poprzednikowi, który wykonał z nim cron, wydawało się, że -fto tylko określenie pliku konfiguracyjnego. Całkiem mylące.
Dan Pritts,
4

W moim przypadku głębokość podkatalogów może się zmienić bez ostrzeżenia, dlatego skonfigurowałem skrypt bash, aby znaleźć wszystkie podkatalogi i utworzyć pozycję config dla każdego katalogu.

Ważne jest również dla mnie zachowanie struktury podkatalogów po rotacji, czego wydawały się nie robić symbole wieloznaczne (tj. Odpowiedź @ DanR). Jeśli wykonujesz codzienne zmiany dzienników, możesz umieścić ten skrypt w codziennej pracy crona.

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

Jak sugerował @DanR, przetestuj za pomocą logrotate -d

krak
źródło
1

To stary wątek, ale możesz wykonać następujące czynności:

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

Te dwie gwiazdki będą pasować do zera lub więcej katalogów. Należy jednak zachować ostrożność podczas definiowania plików dziennika, które mają być obracane, ponieważ można obracać pliki, które zostały już obrócone. Przytoczę tutaj instrukcję logrotate.

Ostrożnie używaj symboli wieloznacznych. Jeśli podasz *, logrotate spowoduje obrócenie wszystkich plików, w tym również wcześniej obróconych. Można to obejść za pomocą dyrektywy olddir lub dokładniejszego symbolu wieloznacznego (takiego jak * .log).

bat_ventzi
źródło
3
ten wzór wieloznaczny nie działał dla mnie. Logrotate 3.8.6 na RHEL 7.3
Northben
Może powinieneś włączyć globstarprzed uruchomieniem logrotate. Umożliwi to bash shopt -s globstar.
bat_ventzi
Mam ten sam problem. Logrotate 3.8.7 na Ubuntu 16.04.3. ls /var/log/basedir/**/*.log działa zgodnie z opisem, ale logrotate nie.
frogstarr78,
też nie działa dla mnie, na logrotate 3.11.0. Nie sądzę, że rozszerzenie bash ma coś wspólnego z Logrotate wildcard. (z wyjątkiem podobnej składni)
Thayne