É possível logrotate
considerar arquivos de log em um diretório e em todos os seus subdiretórios? (ou seja, sem listar explicitamente os subdiretórios.)
É possível logrotate
considerar arquivos de log em um diretório e em todos os seus subdiretórios? (ou seja, sem listar explicitamente os subdiretórios.)
Respostas:
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/*/*/*.log
até 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.
-f
opçã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/config
significa 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 -f
estava apenas especificando o arquivo de configuração. Bastante confuso.
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
É 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).
globstar
antes de executar o logrotate. Isso permitirá que o bash shopt -s globstar
.
-d
coloca o logrotate no modo de execução a seco (ou seja, na verdade não muda nada) na verdade.