Das Linux-Betriebssystem und ausgeführte Anwendungen generieren häufig Protokolle in Dateien. Diese Dateien werden oft in /var/log
gespeichert Verzeichnis oder eine andere von der App angegebene Datei. Wenn diese Protokolldateien nicht rotiert, komprimiert und regelmäßig bereinigt werden, verbrauchen sie schließlich den gesamten verfügbaren Speicherplatz, wodurch der Server einfriert.
In diesem Leitfaden sehen wir uns an, wie Logrotate funktioniert, und sehen uns dann ein Beispiel an, wie Logrotation für unsere benutzerdefinierte App konfiguriert wird.
Voraussetzungen
Um dieser Anleitung zu folgen, benötigen Sie:
- Eine moderne Linux-Distribution wie Ubuntu, Debian, Centos, Rhel, Rocky Linux
- Root-Zugriff auf den Server oder ein Benutzer mit sudo-Berechtigungen
Überprüfen Sie Ihre Logrotate-Version mit diesem Befehl:
logrotate --version
Ausgabe von meinem System:
# logrotate --version
logrotate 3.8.6
Wenn Logrotate nicht installiert ist, erhalten Sie eine Fehlermeldung. Bitte installieren Sie die Software mit dem Paketmanager Ihrer Linux-Distribution.
Logrotate-Konfiguration
Die Logrotate-Konfiguration finden Sie in dieser Datei /etc/logrotate.conf
. Hier befinden sich die Standardeinstellungen. Sie finden auch einige Rotationskonfigurationen für Protokolle, die keinem Systempaket gehören.
Die wichtigste Zeile in dieser Konfigurationsdatei ist include /etc/logrotate.d
. Dies weist logrotate an, auch Konfigurationen zu prüfen, die in diesem Verzeichnis hinzugefügt wurden. Das bedeutet, dass wir für unsere Anwendungen nicht alles in diese Hauptdatei einfügen müssen, wir können individuelle Konfigurationsdateien erstellen und sie zu /etc/logrotate.d
hinzufügen Verzeichnis. Die meisten von Ihnen installierten Pakete, die Hilfe bei der Protokollrotation benötigen, legen ihre logrotate-Konfigurationsdateien ebenfalls in diesem Verzeichnis ab.
Dies ist ein Teil des Inhalts der Hauptdatei /etc/logrotate.conf
Datei:
weekly
rotate 4
create
dateext
compress
weekly
Konfigurieren Sie wöchentliche Protokollrotationen mit Protokolldateien, die dem Root gehören Benutzer und das syslog Grupperotate 4
vier Protokolldateien werden aufbewahrt (Rückstände im Wert von 4 Wochen aufbewahren)create
neue leere Protokolldateien werden erstellt, nachdem die aktuelle rotiert wurdedateex
Datum als Suffix der rotierten Datei verwendencompress
gedrehte Dateien komprimieren
Für die einzelnen Dateien in /etc/logrotate.d
Verzeichnis, schauen wir uns eines als Beispiel an:
cat /etc/logrotate.d/yum
Ausgabe:
/var/log/yum.log {
missingok
notifempty
maxsize 30k
yearly
create 0600 root root
}
Jede dieser Konfigurationen erbt die Standardkonfigurationen in /etc/logrotate.conf
Verzeichnis.
Erklärung:
/var/log/yum.log
diese erste Zeile gibt an, in welcher Datei sich die Konfigurationsziele befindenmissingok
Wenn die Datei nicht existiert, ist sie immer noch in Ordnung und logrotate sollte keinen Fehler verursachen oder einen Fehler protokollierennotifempty
Rotieren Sie die Protokolldatei nicht, wenn sie leer istmaxsize
Wenn die Größe 30 KB überschreitet, rotierenyearly
laufen einmal im Jahrcreate 0600 root root
Erstellen Sie die neue rotierte Datei alsroot
:root
mit Berechtigungen0600
Einige andere Optionen, die oben nicht aufgeführt sind:
rotate 30
dreißig Dateien behalten, die ältesten löschen, wenn sie überschritten werdenmonthly
Rotation einmal im Monatcompress
komprimieren Sie die gedrehten Dateien. dies verwendetgzip
standardmäßig und führt zu Dateien mit der Endung.gz
. Der Komprimierungsbefehl kann mitcompresscmd
geändert werden Möglichkeit.
Protokollrotation der benutzerdefinierten App-Protokolldatei
Wenn unsere benutzerdefinierte Anwendung Protokolle generiert und in eine Datei schreibt, ist es unsere Aufgabe, zu konfigurieren, wie die Rotation für diese Datei durchgeführt wird.
- Wenn wir Root-Zugriff haben, platzieren wir die Konfigurationsdatei idealerweise in
/etc/logrotate.d/
Verzeichnis und es würde wie oben beschrieben funktionieren - Wenn wir keinen Root-Zugriff haben, müssten wir einen Cron konfigurieren, um
logrotate
auszuführen Befehl, der die von uns definierte Konfiguration übergibt - Wenn Sie die Protokolle häufiger als täglich rotieren möchten – z. B. stündlich, da das Logrotate-Setup des Systems nur einmal am Tag ausgeführt wird
Konfiguration in /etc/logrotate.d/
Nehmen wir an, unsere App generiert Protokolle in /var/log/our-app/app.log
und es läuft als centos
. Lassen Sie uns unsere Logrotate-Konfogdatei /etc/logrotate/ourapp.conf
erstellen mit einigen Beispielkonfigurationen:
sudo vim /etc/logrotate.d/ourapp.conf
Konfig:
/var/log/our-app/*.log {
daily
missingok
rotate 30
compress
notifempty
create 0640 centos centos
sharedscripts
postrotate
systemctl reload our-app
endscript
}
Einige neue Direktiven:
create 0640 centos centos
erstellt nach der Rotation eine leere Logdatei mit den angegebenen Berechtigungen0640
und der angegebene Benutzer und die Gruppecentos
sharedscripts
bedeutet, dass alle zur Konfiguration hinzugefügten Skripts nur einmal pro Ausführung ausgeführt werden, anstatt für jede rotierte Datei. Wenn die Direktive/var/log/our-app/*.log
mit mehr als einer Protokolldatei übereinstimmt, das inpostrotate
angegebene Skript würde ohne diese Option zweimal laufenpostrotate
zuendscript
Block enthält ein Skript, das ausgeführt wird, nachdem die Protokolldatei rotiert wurde. In unserem Fall das Neuladen der App. Dies ist manchmal erforderlich, damit Ihre Anwendung auf die neu erstellte Protokolldatei umschaltet. Beachten Sie, dasspostrotate
wird ausgeführt, bevor Protokolle komprimiert werden. Die Komprimierung kann lange dauern, und Ihre Software sollte sofort auf die neue Protokolldatei umstellen. Für Aufgaben, die nach ausgeführt werden müssen Protokolle komprimiert sind, verwenden Sie dielastaction
stattdessen blockieren.
Um die obige Konfiguration zu testen, verwenden Sie diesen Befehl:
sudo logrotate /etc/logrotate.conf --debug
Die Ausgabe wird sich darauf beziehen, welche Protokolldateien Logrotate verarbeitet und was es mit ihnen gemacht hätte. Der Standard-Logrotate-Job wird einmal täglich ausgeführt und enthält Ihre neue Konfiguration.
Beispieldaten in der Ausgabe
...
rotating pattern: /var/log/our-app/*.log after 1 days (30 rotations)
empty log files are not rotated, old logs are removed
No logs found. Rotation not needed.
...
Mit logrotate
Befehl für benutzerdefinierte Konfiguration
Wenn Sie keinen Root-Zugriff auf das System haben und Ihre eigenen benutzerdefinierten Dateien logrotieren möchten, zeigt Ihnen dieser Abschnitt, wie Sie dies tun können.
Sagen wir eine App our-app
generiert Protokolldateien und speichert sie in einem benutzerdefinierten Pfad in unserem Home-Verzeichnis, z. ~/apps/our-app/logs/
. Wenn die Protokolle häufig generiert werden, möchten wir sie hourly
rotieren lassen . Aber logrotate funktioniert nicht stündlich?
Lassen Sie uns zuerst eine Logrotate-Konfigurationsdatei erstellen. Ich werde die Datei im App-conf-Verzeichnis in diesem Pfad ablegen ~/apps/our-app/conf/lorotate.conf
mit folgender Konfiguration:
Bearbeiten Sie die Datei:
vim ~/apps/our-app/conf/lorotate.conf
Mit folgender Konfiguration:
/home/centos/apps/our-app/logs/*.log {
rotate 30
hourly
compress
sharedscripts
delaycompress
missingok
notifempty
dateext
dateformat -%Y-%m-%d-%s
copytruncate
}
Die obige Konfiguration rotiert die Dateien im Verzeichnis /home/centos/apps/our-app/logs/*.log
stündlich, komprimiert und behält nur 30 alte Protokolle bei.
copytruncate
kopiert den Inhalt einer Protokolldatei in eine neue Datei und kürzt dann die Protokolldatei.dateformat
gibt das Format der gedrehten Datei andateext
weist logrotate an, die Datumserweiterung für die rotierten Dateien einzufügen.
Zum Testen:
mkdir -p ~/apps/our-app/{logs,conf}
touch ~/apps/our-app/logs/app.log
Jetzt, da wir die Datei an Ort und Stelle haben, können wir jetzt logrotate
verwenden es zu drehen. Das Einzige, was wir tun müssen, ist, einen state
anzugeben Datei. Ein state
Datei zeichnet auf, was logrotate
ist sah das letzte Mal, als es ausgeführt wurde, damit es weiß, was zu tun ist. Die Einrichtung der Systeminstallation wird bereits in /var/lib/logrotate/status
behandelt aber in unserem Fall müssen wir angeben.
Wir können dafür das Home-Verzeichnis verwenden:
logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose
--verbose
druckt detaillierte Informationen darüber, was Logrotate tut.
Sie sollten eine Ausgabe wie diese sehen:
$ logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose
reading config file /home/centos/apps/our-app/config/logrotate.conf
Allocating hash table for state file, size 15360 B
Handling 1 logs
rotating pattern: /home/centos/apps/our-app/logs/*.log hourly (30 rotations)
empty log files are not rotated, old logs are removed
considering log /home/centos/apps/our-app/logs/app.log
log does not need rotating (log has been already rotated)set default create context
Einige Informationen wurden in der Logrotate-Statusdatei aufgezeichnet:
$ cat ~/logrotate-status
logrotate state -- version 2
"/home/centos/apps/our-app/logs/app.log" 2021-9-4-6:0:0
Logrotate notiert die Protokolle, die es gesehen hat, und wann es sie zuletzt für die Rotation in Betracht gezogen hat. Wenn wir denselben Befehl eine Stunde später ausführen, wird das Protokoll wie erwartet rotiert.
Wenn Sie Logrotate zwingen möchten, die Protokolldatei zu rotieren, wenn dies sonst nicht der Fall wäre, verwenden Sie den --force
Flagge:
logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status --verbose --force
Dies ist beim Testen von postrotate
nützlich und andere Skripte.
Als nächstes soll der obige Befehl automatisch ausgeführt werden. Dies kann mit Crons erreicht werden. Die crontab
Befehl ist praktisch.
Um Crons so zu bearbeiten, dass wir diesen Befehl verwenden können:
crontab -e
Dadurch wird eine Textdatei geöffnet. Möglicherweise enthält die Datei bereits einige Kommentare, die die erwartete grundlegende Syntax erläutern. Bewegen Sie den Cursor nach unten zu einer neuen leeren Zeile am Ende der Datei und fügen Sie Folgendes hinzu:
3 * * * * /usr/sbin/logrotate ~/apps/our-app/config/logrotate.conf --state ~/logrotate-status
Das obige führt den logrotate-Befehl jede 3. Minute jeder Stunde aus. Wir verwenden den vollständigen Pfad /usr/sbin/logrotate
Daher erhalten wir keinen Fehler „Befehl nicht gefunden“.
Speichern Sie die Datei und beenden Sie sie. Dadurch wird crontab installiert und unser Task wird nach dem angegebenen Zeitplan ausgeführt.
Schlussfolgerung
Wir haben uns in diesem Leitfaden logrotate angesehen. Wir konnten seine Version überprüfen, die Standardkonfiguration überprüfen und unsere eigene benutzerdefinierte Einrichtung einrichten. Um mehr über die für Logrotate verfügbaren Befehlszeilen- und Konfigurationsoptionen zu erfahren, können Sie die Handbuchseite lesen, indem Sie man logrotate
ausführen in Ihrem Terminal:
man logrotate