Logrotate löscht komprimierte Protokolle nicht

Logrotate löscht komprimierte Protokolle nicht

Ich habe eine CentOS-Box, auf der rsyslog und logrotate als Syslog-Server für eine ganze Reihe von Netzwerkgeräten laufen. Ich habe eine Weile damit herumgespielt, der logrotate/compression-Teil funktioniert einwandfrei, aber ich kriege es nicht hin, die alten komprimierten .gz-Protokolle zu löschen. Hier ist die grundlegende Konfiguration:

Protokolle werden unter /var/log/syslog gespeichert und jeder Host erstellt basierend auf seiner IP-Adresse oder seinem Hostnamen einen neuen Unterordner. Ich habe zwei bestimmte Hosts, die sehr gesprächig sind, daher habe ich spezielle Regeln für sie, die nach 5 GB abschneiden. Die Idee ist, jeden Tag ein neues Protokoll zu komprimieren und zu beginnen und Protokolle für 60 Tage aufzubewahren.

Hier sind meine Konfigurationen (die meisten davon wurden nicht von mir erstellt, aber ich habe einige davon gepflegt und geändert):

Katze /etc/cron.hourly/logrotate

#!/bin/sh`enter code here`
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

Katze /etc/logrotate.d/syslog

/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    compress
    daily
    #delaycompress
    dateext
    missingok
    rotate 60
    maxage 60
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

cat /etc/logrotate.conf

/var/log/syslog/*/*.log {
daily
rotate 60
maxage 60
compress
}

daily
rotate 60
create
dateext
compress
include /etc/logrotate.d

/var/log/wtmp {
    monthly
    create 0664 root utmp
        minsize 1M
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

# system-specific logs may be also be configured here.
# Specific rule for HOST_A
/var/log/syslog/HOST_A/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}

# Specific rule for HOST_B
/var/log/syslog/HOST_B/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}

Und hier ist ein Beispiel dessen, was ich in meinem Ordner \var\log\syslog\host_a habe:

ls /var/log/syslog/HOST_A/ |

104

ls /var/log/syslog/HOST_A/ -lh

-rw------- 1 root root  416M Jun 20 23:59 HOST_A_2018_06_20.log.1.gz
-rw------- 1 root root   64M Jun 20 16:18 HOST_A_2018_06_20.log.2.gz
-rw------- 1 root root  1.5G Jun 21 23:59 HOST_A_2018_06_21.log.1.gz
<many files redacted>
-rw------- 1 root root  1.6G Sep  4 23:59 HOST_A_2018_09_04.log.1.gz
-rw------- 1 root root  1.5G Sep  5 23:59 HOST_A_2018_09_05.log.1.gz
-rw------- 1 root root  7.7G Sep  6 10:58 HOST_A_2018_09_06.log

Sie können also oben sehen, dass die alten archivierten .gz-Protokolle nach 60 Tagen nicht gelöscht werden. Sie bleiben auf unbestimmte Zeit erhalten. Ich musste regelmäßig eingreifen und ältere Dateien manuell löschen, um die Größe gering zu halten. Diese Dateien reichen vom 20.6. bis zum 6.9. (heute), also 104 Tage. Ich bin sicher, dass ich es falsch konfiguriert habe, aber ich weiß nicht genau, was mir entgeht. Für jede Hilfe wäre ich dankbar.

Antwort1

Sie verwenden zwei Mechanismen für tägliche Protokolldateien, die nicht zusammenarbeiten.

Einerseits lassen Sie syslog täglich Dateien generieren, andererseits lassen Sie logrotate Dateien rotieren. Logrotate behandelt jede tägliche Datei als einen separaten, eindeutigen Satz von Dateien (es betrachtet HOST_A_2018_09_05.log nicht als mit HOST_A_2018_09_06.log verknüpft), sodass es nie zu fünf Dateien pro Muster kommt.

Es ist besser, entweder das Datum nicht in den Dateinamen aufzunehmen oder das Bereinigen alter Dateien durch Syslog selbst durchführen zu lassen.

verwandte Informationen