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

62

Est-il possible de prendre logrotateen compte les fichiers journaux d'un répertoire et de tous ses sous-répertoires? (c.-à-d. sans lister explicitement les sous-répertoires.)

ithinkihaveacat
la source

Réponses:

87

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/*/*/*.logjusqu'à 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.

Dan R
la source
6
Merci! On dirait que -dmet logrotate en mode de fonctionnement à sec (c’est-à-dire qu’il ne change rien).
Ithinkihaveacat
1
Pas vraiment directement pertinent mais probablement utile à quelqu'un. l' -foption 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/configsignifie 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 -fc'était juste spécifier le fichier de configuration. Assez déroutant.
Dan Pritts
4

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

craq
la source
1

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).

bat_ventzi
la source
3
ce modèle générique ne fonctionnait pas pour moi. Logrotate 3.8.6 sur RHEL 7.3
northben
Peut-être devriez-vous l'activer globstaravant de lancer logrotate. Cela l'activera pour bash shopt -s globstar.
bat_ventzi
J'ai le même problème. Logrotate 3.8.7 sur Ubuntu 16.04.3. ls /var/log/basedir/**/*.log fonctionne comme décrit, mais pas logrotate.
frogstarr78
ne fonctionne pas pour moi non plus, sur logrotate 3.11.0. Je ne pense pas que l'extension bash ait quelque chose à voir avec les caractères génériques logrotate. (sauf syntaxe similaire)
Thayne le