Ist es möglich, logrotate
Protokolldateien in einem Verzeichnis und all seinen Unterverzeichnissen zu berücksichtigen? (dh ohne explizite Auflistung der Unterverzeichnisse.)
Ist es möglich, logrotate
Protokolldateien in einem Verzeichnis und all seinen Unterverzeichnissen zu berücksichtigen? (dh ohne explizite Auflistung der Unterverzeichnisse.)
Antworten:
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/*/*/*.log
Sie 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.
-f
Option 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/config
bedeutet, 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, -f
als würde er nur die Konfigurationsdatei spezifizieren. Ziemlich verwirrend.
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
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).
globstar
bevor Sie logrotate ausführen. Dadurch wird es für die Bash aktiviert shopt -s globstar
.
-d
Logrotate in den Trockenlaufmodus versetzt (dh es ändert sich eigentlich nichts).