logrotating archivos en un directorio y sus subdirectorios

62

¿Es posible llegar logrotatea considerar los archivos de registro en un directorio y todos sus subdirectorios? (es decir, sin enumerar explícitamente los subdirectorios).

ithinkihaveacat
fuente

Respuestas:

87

¿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/*/*/*.loghasta 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.

Dan R
fuente
66
¡Gracias! Parece que -dpone logrotate en modo de ejecución en seco (es decir, en realidad no cambia nada) en realidad.
ithinkihaveacat
1
No es realmente directamente relevante, pero probablemente sea útil para alguien. la -fopció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/configsignifica 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 -fsolo estaba especificando el archivo de configuración. Bastante confuso.
Dan Pritts
4

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

craq
fuente
1

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).

bat_ventzi
fuente
3
Este patrón comodín no me funcionó. Logrotate 3.8.6 en RHEL 7.3
northben
Tal vez debería habilitar globstarantes de ejecutar logrotate. Esto lo habilitará para bash shopt -s globstar.
bat_ventzi
Tengo el mismo problema. Logrotate 3.8.7 en Ubuntu 16.04.3. ls /var/log/basedir/**/*.log funciona como se describe, pero logrotate no.
frogstarr78
tampoco funciona para mí, en logrotate 3.11.0. No creo que la expansión bash tenga nada que ver con los comodines logrotate. (excepto por una sintaxis similar)
Thayne