logrotating arquivos em um diretórios e seus subdiretórios

56

É possível obter logrotate para considerar arquivos de log em um diretório e todos os seus subdiretórios? (ou seja, sem listar explicitamente os subdiretórios).

    
por ithinkihaveacat 01.12.2010 / 18:31

3 respostas

79

Qual a profundidade dos seus subdiretórios?

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

Rotacionará todos os arquivos .log no basedir / assim como todos os arquivos .log em qualquer filho direto do basedir. Se você também precisa ir 1 nível mais profundo, adicione outro /var/log/basedir/*/*/*.log até que você tenha cada nível coberto.

Isso pode ser testado usando um arquivo de configuração logrotate separado, que contém uma restrição que não será atendida (um minsize alto) e, em seguida, o log em execução gira-se no modo detalhado

logrotate -d testconfig.conf

o sinalizador -d listará cada arquivo de log que está considerando girar.

    
por 01.12.2010 / 18:49
4

No meu caso, a profundidade dos subdiretórios pode mudar sem aviso, então eu configurei um script bash para encontrar todos os subdiretórios e criar uma entrada de configuração para cada diretório. Também é importante para mim manter a estrutura dos subdiretórios após a rotação, o que os curingas (ou seja, a resposta do @ DanR) não parecem fazer. Se você está fazendo logrotations diários, você poderia colocar este script em um cron-job diário.

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 @DanR sugeriu, teste com logrotate -d

    
por 16.02.2015 / 16:32
1

É um tópico antigo, mas você pode fazer o seguinte:

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

Essas duas estrelas corresponderão a zero ou mais diretórios. Você deve ser cuidadoso, no entanto, como define arquivos de log a serem rotacionados, porque você pode girar arquivos que já foram girados. Vou citar o manual do logrotate aqui.

Please use wildcards with caution. If you specify *, logrotate will rotate all files, including previously rotated ones. A way around this is to use the olddir directive or a more exact wildcard (such as *.log).

    
por 24.03.2017 / 12:28