Ich versuche, mit logrotate eine Protokolldatei zu überwachen, die häufig rotiert. Aber ich bekomme das nicht richtig hin. Kann mir jemand erklären, wie logrotate eigentlich funktioniert?
Wird eine Datei umbenannt und eine neue Datei erstellt?
oder wird eine Datei mit neuem Namen kopiert und die aktuelle Datei geleert?
Vor der Drehung:
131887 -rw-r--r-- 1 root root 11385 Sep 25 03:40 /var/log/sas.log
Nach der Drehung:
131887 -rw-r--r-- 1 root root 0 Sep 25 04:40 /var/log/sas.log
131911 -rw-r--r-- 1 root root 11385 Sep 25 04:40 /var/log/sas.log.1
Antwort1
Wenn die Option truncate in der Konfigurationsdatei aktiviert ist, wird die Datei nicht verschoben - ihr Inhalt wird lediglich in eine andere, neu erstellte Datei kopiert und die aktuelle Datei wird gelöscht, sodass sich die Inode-ID nicht ändert. Tatsächlich wird die Datei nie geändert.
Antwort2
Bei der Rotation wird die aktuelle Logdatei verschoben und ggf. komprimiert, wenn das angegeben ist. Anschließend wird sie neu erstellt. [suche nach einer anderen Quelle als meiner Erfahrung]
Das ist ein Problem, wenn ein Dienst ausgeführt wird, bei dem die Protokolldatei zum Zeitpunkt der Rotation geöffnet ist. Die Verknüpfung der Datei wird aufgehoben, aber der Speicherplatz wird nicht wirklich freigegeben, da die Datei noch geöffnet ist.
Aus diesem Grund installieren Dienste häufig ein aufwändigeres Logrotate-Skript, das die Rotation handhabt. Sehen Sie sich als Beispiel die /etc/logrotate.d/nginx
Definition des Rotationsverhaltens für den nginx
Webserver an:
[....]
postrotate
invoke-rc.d nginx rotate >/dev/null 2>&1
endscript
Der postrotate
Block wird ausgeführt, nachdem die neue Protokolldatei erstellt wurde. Er ruft das Serviceskript von nginx auf und rotate
weist den Dienst an,Öffnen Sie die Protokolldatei erneut.