registrando arquivos em um diretório e seus subdiretórios

62

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

ithinkihaveacat
fonte

Respostas:

87

Qual a profundidade dos seus subdiretórios?

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

Girará todos os arquivos .log em basedir /, bem como todos os arquivos .log em qualquer filho direto do basedir. Se você também precisar ir um nível mais fundo, adicione outro /var/log/basedir/*/*/*.logaté ter cada nível coberto.

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

logrotate -d testconfig.conf

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

Dan R
fonte
6
Obrigado! Parece que -dcoloca o logrotate no modo de execução a seco (ou seja, na verdade não muda nada) na verdade.
Ithinkihaveacat
11
Não é diretamente relevante, mas provavelmente útil para alguém. a -fopção diz ao logrotate para "forçar a execução". uma palavra simples no final do comando é um arquivo de configuração a ser usado em vez do padrão. então logrotate -f /some/configsignifica executar com esse arquivo de configuração e sempre executar, mesmo que o arquivo de configuração diga que ainda não é hora de executar. Aos meus olhos destreinados, e ao meu antecessor que fez um trabalho cron com isso, parecia que -festava apenas especificando o arquivo de configuração. Bastante confuso.
Dan Pritts
4

No meu caso, a profundidade dos subdiretórios pode mudar sem aviso, portanto, 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 caracteres curinga (ou seja, a resposta do @ DanR) parecem não funcionar. Se você estiver fazendo rotações diárias de log, poderá colocar esse 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 o @DanR sugeriu, teste com logrotate -d

craq
fonte
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. Porém, você deve ter cuidado ao definir os arquivos de log a serem rotacionados, porque é possível rotacionar arquivos que já foram rotacionados. Vou citar o manual de logrotate aqui.

Use curingas com cautela. Se você especificar *, o logrotate girará todos os arquivos, incluindo os rotacionados anteriormente. Uma maneira de contornar isso é usar a diretiva olddir ou um curinga mais exato (como * .log).

bat_ventzi
fonte
3
esse padrão curinga não funcionou para mim. Logrotate 3.8.6 no RHEL 7.3
northben 30/05
Talvez você deva ativar globstarantes de executar o logrotate. Isso permitirá que o bash shopt -s globstar.
bat_ventzi
Eu tenho o mesmo problema. Logrotate 3.8.7 no Ubuntu 16.04.3. ls /var/log/basedir/**/*.log funciona como descrito, mas o logrotate não.
precisa saber é o seguinte
também não funciona para mim, no logrotate 3.11.0. Eu não acho que a expansão do bash tenha algo a ver com os curingas do logrotate. (exceto sintaxe semelhante)
Thayne