logrotating Dateien in einem Verzeichnis und seinen Unterverzeichnissen

62

Ist es möglich, logrotateProtokolldateien in einem Verzeichnis und all seinen Unterverzeichnissen zu berücksichtigen? (dh ohne explizite Auflistung der Unterverzeichnisse.)

ithinkihaveacat
quelle

Antworten:

87

Wie tief gehen Ihre Unterverzeichnisse?

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

Rotiert alle .log- Dateien in basedir / sowie alle .log- Dateien in einem direkten untergeordneten Element von basedir. Wenn Sie auch eine Stufe tiefer gehen müssen, fügen /var/log/basedir/*/*/*.logSie einfach eine weitere hinzu, bis jede Stufe abgedeckt ist.

Dies kann getestet werden, indem Sie eine separate logrotate-Konfigurationsdatei verwenden, die eine Einschränkung enthält, die nicht erfüllt wird (eine hohe Mindestgröße), und dann log rotieren Sie sich im ausführlichen Modus

logrotate -d testconfig.conf

Das Flag -d listet jede Protokolldatei auf, die gedreht werden soll.

Dan R
quelle
6
Vielen Dank! Sieht so aus, als würde -dLogrotate in den Trockenlaufmodus versetzt (dh es ändert sich eigentlich nichts).
Ithinkihaveacat
1
Nicht wirklich direkt relevant, aber wahrscheinlich nützlich für jemanden. Die -fOption weist logrotate an, "Lauf erzwingen". Ein leeres Wort am Ende des Befehls ist eine Konfigurationsdatei, die anstelle der Standarddatei verwendet wird. Das logrotate -f /some/configbedeutet, dass Sie mit dieser Konfigurationsdatei ausgeführt werden und immer ausgeführt werden, selbst wenn die Konfigurationsdatei angibt, dass es noch nicht an der Zeit ist, sie auszuführen. Für meine ungeübten Augen und für meinen Vorgänger, der damit einen Cronjob gemacht hat, schien es, -fals würde er nur die Konfigurationsdatei spezifizieren. Ziemlich verwirrend.
Dan Pritts
4

In meinem Fall kann sich die Tiefe der Unterverzeichnisse ohne Vorwarnung ändern. Daher habe ich ein Bash-Skript eingerichtet, um alle Unterverzeichnisse zu finden und einen Konfigurationseintrag für jedes Verzeichnis zu erstellen.

Für mich ist es auch wichtig, die Struktur der Unterverzeichnisse nach der Rotation beizubehalten, was Wildcards (dh die Antwort von @ DanR) anscheinend nicht taten. Wenn Sie tägliche Protokollrotationen durchführen, können Sie dieses Skript in einen täglichen Cron-Job einfügen.

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

Testen Sie wie von @DanR vorgeschlagen mit logrotate -d

craq
quelle
1

Es ist ein alter Thread, aber Sie können Folgendes tun:

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

Diese beiden Sterne stimmen mit keinem oder mehreren Verzeichnissen überein. Sie müssen jedoch vorsichtig sein, wie Sie die zu drehenden Protokolldateien definieren, da Sie bereits gedrehte Dateien drehen können. Ich werde hier das Handbuch von logrotate zitieren.

Bitte verwenden Sie Wildcards mit Vorsicht. Wenn Sie * angeben, dreht logrotate alle Dateien, einschließlich der zuvor gedrehten. Eine Möglichkeit, dies zu umgehen, ist die Verwendung der olddir-Direktive oder eines genaueren Platzhalters (z. B. * .log).

bat_ventzi
quelle
3
Dieses Platzhaltermuster hat bei mir nicht funktioniert. Logrotate 3.8.6 auf RHEL 7.3
Northben
Möglicherweise sollten Sie es aktivieren, globstarbevor Sie logrotate ausführen. Dadurch wird es für die Bash aktiviert shopt -s globstar.
bat_ventzi
Ich habe das gleiche Problem. Logrotate 3.8.7 unter Ubuntu 16.04.3. ls /var/log/basedir/**/*.log funktioniert wie beschrieben, logrotate jedoch nicht.
Frogstarr78
funktioniert auch bei mir nicht, bei logrotate 3.11.0. Ich glaube nicht, dass die Bash-Erweiterung etwas mit logrotierten Wildcards zu tun hat. (mit Ausnahme einer ähnlichen Syntax)
Thayne