Est-il possible d'obtenir logrotate
pour considérer les fichiers journaux d'un répertoire et de tous ses sous-répertoires ? (c'est-à-dire sans énumérer explicitement les sous-répertoires).
Réponses
Trop de publicités?Quelle est la profondeur de vos sous-répertoires ?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
fera tourner tous les .log dans basedir/ ainsi que tous les fichiers .log dans tout enfant direct de basedir. Si vous avez également besoin d'aller 1 niveau plus profond, ajoutez simplement un autre /var/log/basedir/*/*/*.log
jusqu'à ce que vous ayez couvert chaque niveau.
Ceci peut être testé en utilisant un fichier de configuration logrotate séparé qui contient une contrainte qui ne sera pas respectée (une taille minimale élevée) et en exécutant log rotate vous-même en mode verbeux.
logrotate -d testconfig.conf
le drapeau -d listera chaque fichier journal qu'il envisage de faire tourner.
C'est un vieux sujet, mais vous pouvez faire ce qui suit :
/var/log/basedir/**/*.log {
daily
rotate 5
}
Ces deux étoiles correspondent à zéro ou plusieurs répertoires. Vous devez cependant faire attention à la manière dont vous définissez les fichiers journaux à faire tourner, car vous pouvez faire tourner des fichiers qui ont déjà été tournés. Je vais citer ici le manuel de logrotate.
Veuillez utiliser les caractères de remplacement avec prudence. Si vous spécifiez *, logrotate fera tourner tous les fichiers, y compris les fichiers précédemment tournés. Une façon de contourner ce problème est d'utiliser la directive olddir ou un caractère générique plus précis (tel que *.log).
Dans mon cas, la profondeur des sous-répertoires peut changer sans avertissement, donc j'ai mis en place un bash script pour trouver tous les sous-répertoires et créer une entrée de configuration pour chaque répertoire.
Il est également important pour moi de conserver la structure des sous-répertoires après la rotation, ce que les caractères génériques (c'est-à-dire la réponse de @DanR) ne semblent pas faire. Si vous faites des rotations de journaux quotidiennes, vous pourriez mettre ce script dans un travail cron quotidien.
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
Comme @DanR l'a suggéré, testez avec logrotate -d