È possibile prendere logrotate
in considerazione i file di registro in una directory e in tutte le sue sottodirectory? (ovvero senza elencare esplicitamente le sottodirectory.)
È possibile prendere logrotate
in considerazione i file di registro in una directory e in tutte le sue sottodirectory? (ovvero senza elencare esplicitamente le sottodirectory.)
Risposte:
Quanto in profondità vanno le tue sottodirectory?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
Ruoterà tutti i file .log in basedir / così come tutti i file .log in qualsiasi figlio diretto di basedir. Se devi anche andare più in profondità di 1 livello, aggiungine un altro /var/log/basedir/*/*/*.log
fino a quando non avrai coperto tutti i livelli.
Questo può essere testato usando un file di configurazione logrotate separato che contiene un vincolo che non verrà soddisfatto (un minsize alto) e quindi eseguendo il log ruotate voi stessi in modalità dettagliata
logrotate -d testconfig.conf
il flag -d elencherà ogni file di registro che sta considerando di ruotare.
-f
opzione dice a logrotate di "forzare l'esecuzione". una parola nuda alla fine del comando è un file di configurazione da utilizzare al posto del valore predefinito. quindi logrotate -f /some/config
significa eseguire con quel file di configurazione, ed eseguire sempre anche se il file di configurazione dice che non è ancora il momento di eseguire. Ai miei occhi inesperti e al mio predecessore che ha svolto un lavoro cron con quello, sembrava che -f
stesse semplicemente specificando il file di configurazione. Abbastanza confuso.
Nel mio caso, la profondità delle sottodirectory può cambiare senza preavviso, quindi ho impostato uno script bash per trovare tutte le sottodirectory e creare una voce di configurazione per ogni directory.
È anche importante per me mantenere la struttura delle sottodirectory dopo la rotazione, cosa che i caratteri jolly (ovvero la risposta di @ DanR) non sembravano fare. Se si eseguono rotazioni giornaliere dei registri, è possibile inserire questo script in un cron-job giornaliero.
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
Come suggerito da @DanR, prova con logrotate -d
È vecchio thread, ma puoi fare quanto segue:
/var/log/basedir/**/*.log {
daily
rotate 5
}
Queste due stelle corrisponderanno a zero o più directory. È necessario prestare attenzione, tuttavia, a come definire i file di registro da ruotare, poiché è possibile ruotare i file che sono già stati ruotati. Citerò qui il manuale di logrotate.
Utilizzare i caratteri jolly con cautela. Se si specifica *, logrotate ruoterà tutti i file, inclusi quelli precedentemente ruotati. Un modo per aggirare questo è usare la direttiva olddir o un carattere jolly più esatto (come * .log).
globstar
prima di eseguire logrotate. Questo lo abiliterà per bash shopt -s globstar
.
-d
logrotate sia in modalità di funzionamento a secco (cioè non cambi effettivamente nulla) in realtà.