Est-il possible de prendre logrotate
en compte les fichiers journaux d'un répertoire et de tous ses sous-répertoires? (c.-à-d. sans lister explicitement les sous-répertoires.)
Est-il possible de prendre logrotate
en compte les fichiers journaux d'un répertoire et de tous ses sous-répertoires? (c.-à-d. sans lister explicitement les sous-répertoires.)
Réponses:
Quelle est la profondeur de vos sous-répertoires?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
Fera tourner tous les fichiers .log dans basedir / ainsi que tous les fichiers .log dans n'importe quel enfant direct de basedir. Si vous devez également approfondir un niveau, ajoutez-en un autre /var/log/basedir/*/*/*.log
jusqu'à ce que chaque niveau soit couvert.
Cela peut être testé en utilisant un fichier de configuration séparé de logrotate qui contient une contrainte qui ne sera pas remplie (une taille élevée), puis en exécutant le journal en rotation vous-même en mode prolixe
logrotate -d testconfig.conf
L'indicateur -d listera chaque fichier journal qu'il envisage de faire pivoter.
-f
option indique à logrotate de "forcer l'exécution". un mot simple à la fin de la commande est un fichier de configuration à utiliser à la place de la valeur par défaut. cela logrotate -f /some/config
signifie donc exécuter avec ce fichier de configuration, et toujours exécuté même si le fichier de configuration indique qu'il n'est pas encore temps de s'exécuter. À mes yeux inexpérimentés et à mon prédécesseur qui a fait un travail cron avec cela, il me semblait que -f
c'était juste spécifier le fichier de configuration. Assez déroutant.
Dans mon cas, la profondeur des sous-répertoires peut changer sans préavis. J'ai donc configuré un script bash 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.-à-d. La réponse de @ DanR) ne semblaient pas faire. Si vous effectuez des rotations quotidiennes de journaux, vous pouvez placer ce script dans un cron-job 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
C'est un vieux fil, mais vous pouvez faire ce qui suit:
/var/log/basedir/**/*.log {
daily
rotate 5
}
Ces deux étoiles correspondront à zéro ou plusieurs répertoires. Vous devez cependant faire attention à la manière dont vous définissez la rotation des fichiers journaux, car vous pouvez faire pivoter des fichiers déjà pivotés. Je vais citer le manuel de logrotate ici.
Veuillez utiliser des caractères génériques avec prudence. Si vous spécifiez *, logrotate fera pivoter tous les fichiers, y compris ceux précédemment pivotés. Une solution consiste à utiliser la directive olddir ou un caractère générique plus exact (tel que * .log).
globstar
avant de lancer logrotate. Cela l'activera pour bash shopt -s globstar
.
-d
met logrotate en mode de fonctionnement à sec (c’est-à-dire qu’il ne change rien).