Protokolldrehung und -komprimierung mit logrotate
- Stufe: Mittelstufe
- Geschätzte Zeit: ~20 Minuten
- Ziel: Konfigurieren Sie logrotate, um Anwendungsprotokolldateien automatisch zu komprimieren und zu rotieren, um eine Erschöpfung des Speicherplatzes zu verhindern.
Einführung
Protokolle sind ein kritischer Bestandteil der Verwaltung jeder Produktionsanwendung: Ohne sie wäre es sehr schwierig, zuverlässig zu verstehen, was schiefgelaufen ist und was dagegen zu tun ist. Eine stark frequentierte Anwendung kann Tausende von Einträgen pro Minute generieren, und alle werden typischerweise in Dateien gespeichert. Wir müssen alte Protokolle rechtzeitig komprimieren und löschen, um zu vermeiden, dass der Speicherplatz ausgeht. In diesem Tutorial werden wir logrotate auf einem Linux-Server konfigurieren.
Was ist logrotate?
logrotate ist ein Linux-Dienstprogramm, das entwickelt wurde, um die Verwaltung von Systemen zu vereinfachen, die eine große Anzahl von Protokolldateien erzeugen. Es ermöglicht, dass Protokolle automatisch komprimiert, rotiert und gelöscht werden. Es wird typischerweise täglich, wöchentlich oder monatlich über cron oder einen systemd-Timer ausgeführt.
Voraussetzungen
Bevor Sie beginnen, stellen Sie sicher, dass die folgenden Bedingungen erfüllt sind:
- Betriebssystem: Ubuntu 20.04/22.04/24.04 LTS, Debian 11/12 oder CentOS/RHEL 7+
- logrotate: Version 3.x (Überprüfung in Schritt 1)
- Zugriff: sudo- oder Root-Zugriff auf den Server
- Erforderliches Wissen: sicherer Umgang mit der Linux-Befehlszeile und grundlegende Dateibearbeitung
Schritt 1: Überprüfung der logrotate-Installation
Um die Installation zu überprüfen, führen Sie einfach aus:
logrotate --version
Erwartete Ausgabe:
logrotate 3.19.0 Standard-Mail-Befehl: /usr/bin/mail Standard-Komprimierungsbefehl: /bin/gzip Standard-Dekomprimierungsbefehl: /bin/gunzip Standard-Komprimierungserweiterung: .gz Standard-Statusdateipfad: /var/lib/logrotate/status
Wenn der Befehl nicht gefunden wird – logrotate ist nicht installiert. Installieren Sie es:
Debian/Ubuntu:
sudo apt install logrotate
CentOS/RHEL:
sudo yum install logrotate
Schritt 2: Verständnis der Konfigurationsstruktur
Die Hauptkonfiguration befindet sich unter /etc/logrotate.conf – wir werden sie vorerst unverändert lassen. Unsere Regeln für spezifische Dienste werden in /etc/logrotate.d/ abgelegt – für jeden Dienst sollte dort eine separate Datei abgelegt werden.
Bevor Sie etwas hinzufügen, überprüfen Sie, ob bereits eine Konfiguration für Ihren Dienst vorhanden ist:
ls /etc/logrotate.d/
Für beliebte Dienste wie nginx oder Apache sind Konfigurationen normalerweise bereits vorhanden. Wenn nginx oder apache2 bereits vorhanden ist – öffnen Sie diese Datei und passen Sie die Rotationsanzahl und die Komprimierungseinstellungen an Ihre Bedürfnisse an, anstatt ein Duplikat zu erstellen.
Schritt 3: Hinzufügen einer Dienstkonfiguration
Angenommen, es gibt eine benutzerdefinierte Anwendung und ihre Protokolle befinden sich unter /opt/myapp/*.log.
Erstellen und öffnen Sie die Datei:
sudo nano /etc/logrotate.d/myapp
Fügen Sie das Folgende ein:
/opt/myapp/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate systemctl reload myapp > /dev/null 2>&1 || true endscript }
Diese Konfiguration weist logrotate an:
- daily – Protokolle täglich rotieren; Sie können auch
weeklyodermonthlyangeben. - missingok – keinen Fehler auslösen, wenn die Protokolldatei fehlt.
- rotate 14 – 14 rotierte Kopien vor dem Löschen aufbewahren.
- compress – rotierte Protokolle mit gzip komprimieren.
- delaycompress – die neueste Rotation nicht komprimieren; nützlich, wenn die Anwendung die Datei noch geöffnet hält.
- notifempty – Rotation überspringen, wenn die Protokolldatei leer ist.
- create 0640 www-data adm – eine neue leere Protokolldatei mit den angegebenen Berechtigungen, Eigentümer und Gruppe erstellen. Der Eigentümer sollte dem Benutzer entsprechen, unter dem die Anwendung läuft (in Debian-basierten Systemen oft
www-data, in RHEL-basierten Systemen normalerweiseapacheodernginx). - sharedscripts – das postrotate-Skript einmal ausführen, auch wenn mehrere Dateien übereinstimmen.
- postrotate – der Anwendung signalisieren, ihre Datei-Handles nach der Rotation erneut zu öffnen.
Wenn das Verzeichnis /opt/myapp/ oder die Protokolldateien zum Zeitpunkt des ersten Laufs noch nicht existieren, ist das kein Problem. Die missingok-Direktive wird logrotate veranlassen, die Datei stillschweigend zu überspringen, ohne einen Fehler auszulösen. Die Protokollrotation beginnt automatisch, sobald die Anwendung die Protokolle erstellt.
Schritt 4: Testen der Konfiguration
4.1 Trockentest
Nach dem Schreiben der Konfiguration sollte sie überprüft werden. Das -d-Flag führt logrotate im Debug-Modus aus – es wird nichts tatsächlich geändert:
sudo logrotate -d /etc/logrotate.d/myapp
Der -d-Modus gibt Diagnoseinformationen aus, ändert jedoch keine Dateien.
4.2 Erzwungener echter Lauf
Wenn der Trockentest korrekt aussieht – erzwingen Sie eine tatsächliche Rotation mit dem -f-Flag:
sudo logrotate -f /etc/logrotate.d/myapp
Wichtig: Das -f-Flag löst eine tatsächliche Rotation aus. Führen Sie es nur aus, nachdem der Testlauf korrekt aussieht.
Schritt 5: Überprüfung des Ergebnisses
Nach den ersten paar Rotationen überprüfen Sie das Protokollverzeichnis:
ls -lh /opt/myapp/
Erwartete Ausgabe:
insgesamt 28K -rw-r----- 1 www-data adm 0 Jan 17 12:00 app.log -rw-r----- 1 www-data adm 12K Jan 17 11:59 app.log.1 -rw-r----- 1 www-data adm 11K Jan 16 12:00 app.log.2.gz -rw-r----- 1 www-data adm 9K Jan 15 12:00 app.log.3.gz
Die neueste Rotation (app.log.1) bleibt aufgrund von delaycompress unkomprimiert. Alles Ältere ist gezippt. Genau das wollten wir.
Schritt 6: Überprüfung des automatischen Zeitplans
logrotate läuft automatisch – über cron oder einen systemd-Timer, abhängig von der Distribution.
Cron-basierte Systeme
cat /etc/cron.daily/logrotate
Wenn die Datei existiert – das ist die Datei, die logrotate täglich ausführt.
Systemd-basierte Systeme
Auf neueren Systemen kann logrotate über einen systemd-Timer anstelle von cron ausgeführt werden.
Überprüfen Sie:
systemctl list-timers | grep logrotate
Sie sollten einen Timer mit den letzten und nächsten Ausführungszeiten sehen, etwa so:
Do 2026-01-18 00:00:00 UTC 23h übrig Mi 2026-01-17 00:00:11 UTC 47 min vor logrotate.timer
Wenn der logrotate.timer in der Ausgabe fehlt – ist der Timer deaktiviert. Aktivieren Sie ihn:
sudo systemctl enable logrotate.timer
sudo systemctl start logrotate.timer
Statusdatei
Sie können überprüfen, wann logrotate zuletzt durch seine eigene Statusdatei ausgeführt wurde:
cat /var/lib/logrotate/status
Dies ist die eigene Rotationshistorie von logrotate. Nach dem ersten echten Lauf sehen Sie jede Protokolldatei mit dem Datum ihrer letzten Rotation:
"/opt/myapp/app.log" 2026-1-17 "/var/log/nginx/access.log" 2026-1-17
Wenn ein Protokoll nicht wie erwartet rotiert – ist dies der erste Ort, an dem Sie nachsehen sollten.
Rollback
Um alles rückgängig zu machen, löschen Sie einfach die Konfigurationsdatei aus /etc/logrotate.d/:
sudo rm /etc/logrotate.d/myapp
Dies wird die Protokollverarbeitung für Ihre Anwendung stoppen. Bereits rotierte Dateien werden nicht gelöscht.
Um logrotate vollständig zu entfernen:
Debian/Ubuntu:
sudo apt remove logrotate
CentOS/RHEL:
sudo yum remove logrotate
Wichtig: Das Entfernen von logrotate deaktiviert die Protokollrotation für das gesamte System, einschließlich nginx, rsyslog und anderer Dienste, die darauf angewiesen sind.
Fazit
Das ist alles. Eine gut geschriebene Datei in /etc/logrotate.d/, überprüft mit -d – und es ist erledigt. Protokolle bleiben sauber, die Festplatte bleibt gesund, und Sie müssen nicht mehr darüber nachdenken.
Dokumentversion: 1.2
Zuletzt aktualisiert: März 2026
Besitzer: Technisches Dokumentationsteam