Czy można wziąć logrotate
pod uwagę pliki dziennika w katalogu i wszystkich jego podkatalogach? (tzn. bez wyraźnego wyświetlania podkatalogów).
Czy można wziąć logrotate
pod uwagę pliki dziennika w katalogu i wszystkich jego podkatalogach? (tzn. bez wyraźnego wyświetlania podkatalogów).
Odpowiedzi:
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/*/*/*.log
dopó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ć.
-f
opcja 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/config
oznacza 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 -f
to tylko określenie pliku konfiguracyjnego. Całkiem mylące.
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
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).
globstar
przed uruchomieniem logrotate. Umożliwi to bash shopt -s globstar
.
-d
to, że faktycznie wprowadza logrotate w tryb pracy na sucho (tzn. Nic nie zmienia).