¿Es posible llegar logrotate
a considerar los archivos de registro en un directorio y todos sus subdirectorios? (es decir, sin enumerar explícitamente los subdirectorios).
¿Es posible llegar logrotate
a considerar los archivos de registro en un directorio y todos sus subdirectorios? (es decir, sin enumerar explícitamente los subdirectorios).
Respuestas:
¿Qué tan profundo van tus subdirectorios?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
Rotará todos los archivos .log en basedir / así como todos los archivos .log en cualquier hijo directo de basedir. Si también necesita ir 1 nivel más profundo, simplemente agregue otro /var/log/basedir/*/*/*.log
hasta que haya cubierto cada nivel.
Esto se puede probar mediante el uso de un archivo de configuración de logrotate separado que contiene una restricción que no se cumplirá (un tamaño muy alto) y luego ejecutar el registro rotar usted mismo en modo detallado
logrotate -d testconfig.conf
el distintivo -d enumerará cada archivo de registro que está considerando rotar.
-f
opción le dice a logrotate que "ejecute forzada". una palabra simple al final del comando es un archivo de configuración para usar en lugar del predeterminado. entonces logrotate -f /some/config
significa ejecutar con ese archivo de configuración, y siempre ejecutar incluso si el archivo de configuración dice que aún no es hora de ejecutar. Para mis ojos inexpertos, y para mi predecesor que hizo un trabajo cron con eso, parecía que -f
solo estaba especificando el archivo de configuración. Bastante confuso.
En mi caso, la profundidad de los subdirectorios puede cambiar sin previo aviso, por lo que configuré un script bash para encontrar todos los subdirectorios y crear una entrada de configuración para cada directorio.
También es importante para mí mantener la estructura de subdirectorios después de la rotación, que los comodines (es decir, la respuesta de @ DanR) no parecían hacer. Si está haciendo rotaciones de registro diarias, podría colocar este script en un trabajo cron diario.
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
Como sugirió @DanR, pruebe con logrotate -d
Es un hilo viejo, pero puedes hacer lo siguiente:
/var/log/basedir/**/*.log {
daily
rotate 5
}
Estas dos estrellas coincidirán con cero o más directorios. Sin embargo, debe tener cuidado de cómo define los archivos de registro para que se roten, porque puede rotar los archivos que ya se han rotado. Citaré el manual de logrotate aquí.
Utilice comodines con precaución. Si especifica *, logrotate rotará todos los archivos, incluidos los previamente rotados. Una forma de evitar esto es usar la directiva olddir o un comodín más exacto (como * .log).
globstar
antes de ejecutar logrotate. Esto lo habilitará para bash shopt -s globstar
.
-d
pone logrotate en modo de ejecución en seco (es decir, en realidad no cambia nada) en realidad.