web-dev-qa-db-fra.com

journalisation des fichiers dans un répertoire et ses sous-répertoires

Est-il possible que logrotate considère les fichiers journaux dans un répertoire et tous ses sous-répertoires? (c'est-à-dire sans lister explicitement les sous-répertoires.)

63
ithinkihaveacat

Jusqu'où vont vos sous-répertoires?

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

Tournera tous les fichiers . Log dans basedir/ainsi que tous les fichiers . Log dans tout enfant direct de basedir. Si vous devez également aller plus loin d'un niveau, ajoutez simplement un autre /var/log/basedir/*/*/*.log jusqu'à ce que chaque niveau soit couvert.

Cela peut être testé en utilisant un fichier de configuration logrotate distinct qui contient une contrainte qui ne sera pas respectée (une taille de minute élevée), puis en exécutant log vous tournez en mode verbeux

logrotate -d testconfig.conf

l'indicateur -d répertorie chaque fichier journal qu'il envisage de faire pivoter.

95
Dan R

Dans mon cas, la profondeur des sous-répertoires peut changer sans avertissement, j'ai donc mis en place 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'est-à-dire la réponse de @ DanR) ne semblaient pas faire. Si vous effectuez des rotations journalières des 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 l'a suggéré @DanR, testez avec logrotate -d

4
craq

C'est du 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. Cependant, vous devez faire attention à la façon dont vous définissez les fichiers journaux à faire pivoter, car vous pouvez faire pivoter les fichiers qui ont déjà été tournés. Je vais citer le manuel de logrotate ici.

Veuillez utiliser les caractères génériques avec prudence. Si vous spécifiez *, logrotate fera pivoter tous les fichiers, y compris ceux précédemment tournés. Un moyen de contourner ce problème consiste à utiliser la directive olddir ou un caractère générique plus exact (tel que * .log).

2
bat_ventzi