TL;DR — Kurzzusammenfassung
Logrotate automatisiert Log-Rotation unter Linux. Schlüsseldirektiven, postrotate-Skripte, größenbasierte Rotation und sicheres Testen der Konfiguration.
Das Verwalten von Log-Dateien unter Linux ist eine routinemäßige Betriebsaufgabe, die bei Vernachlässigung zu vollen Festplatten, nachlassender Leistung und ausgefallenen Diensten führt. Logrotate ist das Standardwerkzeug zur Automatisierung von Log-Rotation, Komprimierung und Bereinigung auf praktisch allen Linux-Distributionen. Dieser Leitfaden deckt alles ab — von der globalen Konfiguration über App-spezifische Beispiele bis hin zu Teststrategien und der Behebung realer Probleme.
Voraussetzungen
- Linux-Server mit Ubuntu, Debian, RHEL oder einer kompatiblen Distribution.
logrotateinstalliert (apt install logrotateoderyum install logrotate).- Grundlegende Kenntnisse der Kommandozeile und Dienstverwaltung mit
systemctl. - Root- oder sudo-Zugriff zum Bearbeiten von
/etc/logrotate.confund/etc/logrotate.d/.
Wie Logrotate Funktioniert
Logrotate läuft nicht als Daemon. Es wird täglich durch den Cron-Eintrag in /etc/cron.daily/logrotate aufgerufen. Bei jeder Ausführung liest es seine Konfiguration, konsultiert die Statusdatei unter /var/lib/logrotate/status, um zu bestimmen, wann jedes Log zuletzt rotiert wurde, und handelt nur, wenn das geplante Intervall abgelaufen ist.
# Statusdatei manuell prüfen
cat /var/lib/logrotate/status
Die Statusdatei enthält Einträge wie:
"/var/log/nginx/access.log" 2026-3-21-6:0:0
"/var/log/syslog" 2026-3-22-6:0:0
Wird diese Datei beschädigt oder gelöscht, rotiert logrotate beim nächsten Lauf alle Logs, als ob sie noch nie rotiert worden wären.
Globale Konfiguration vs. App-spezifische Konfigurationen
/etc/logrotate.conf — Globale Standardwerte
Diese Datei legt Standardwerte fest, die von allen Konfigurationen geerbt werden:
# Standardmäßig wöchentlich rotieren
weekly
# 4 Rotationen aufbewahren
rotate 4
# Rotierte Logs komprimieren
compress
# App-spezifische Konfigurationen laden
include /etc/logrotate.d
/etc/logrotate.d/ — App-spezifische Überschreibungen
Jede Datei in diesem Verzeichnis konfiguriert die Rotation einer Anwendung:
/var/log/nginx/access.log /var/log/nginx/error.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl reload nginx
endscript
}
Wichtige Direktiven
| Direktive | Wirkung |
|---|---|
daily / weekly / monthly | Rotationsfrequenz |
rotate N | Anzahl der aufzubewahrenden rotierten Dateien vor dem Löschen |
compress | Rotierte Dateien mit gzip komprimieren |
delaycompress | Die vorherige Rotation komprimieren, nicht die gerade rotierte |
missingok | Stillschweigend überspringen, wenn die Log-Datei fehlt |
notifempty | Nicht rotieren, wenn das Log leer ist |
create Modus Eigentümer Gruppe | Nach der Rotation eine neue leere Log-Datei erstellen |
sharedscripts | postrotate einmal für alle übereinstimmenden Dateien ausführen |
dateext | Datum statt Zahl an den Namen der rotierten Datei anhängen |
size N / minsize N / maxsize N | Rotation basierend auf der Dateigröße auslösen |
copytruncate vs. postrotate
postrotate / endscript (empfohlen)
Nachdem logrotate die Log-Datei umbenannt hat, führt der postrotate-Block einen Befehl aus, der der Anwendung mitteilt, den alten Dateideskriptor zu schließen und die neue leere Datei zu öffnen:
postrotate
systemctl reload nginx
# oder für Prozesse, die SIGUSR1 verwenden:
kill -USR1 $(cat /var/run/gunicorn.pid) 2>/dev/null || true
endscript
copytruncate
Einige Anwendungen können keine Dateideskriptoren neu laden. copytruncate weist logrotate an, die Datei in den rotierten Namen zu kopieren und dann das Original auf null Bytes zu kürzen:
/var/log/meinapp/app.log {
daily
rotate 7
compress
delaycompress
copytruncate
}
Vorsicht: Es gibt ein kleines Zeitfenster zwischen dem Kopieren und dem Kürzen, in dem neue Log-Zeilen in die Originaldatei geschrieben werden können und aus dem rotierten Archiv verloren gehen. Bevorzugen Sie für hochvolumige Logs nach Möglichkeit postrotate.
Größenbasierte Rotation
/var/log/meinapp/app.log {
# Rotieren, wenn die Datei 100 MB überschreitet, unabhängig vom Zeitplan
size 100M
# Nur rotieren, wenn die Datei mindestens 10 MB groß UND das Intervall abgelaufen ist
# minsize 10M
# Sofort rotieren, wenn die Datei 500 MB überschreitet
# maxsize 500M
rotate 10
compress
delaycompress
missingok
notifempty
}
Beispiele nach Anwendung
Nginx
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
nginx -s reopen
endscript
}
nginx -s reopen sendet SIGUSR1 an den Master-Prozess, wodurch alle Worker ihre Log-Dateien wieder öffnen.
Docker
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
Die bevorzugte Lösung ist die Konfiguration des Docker-Daemons mit "log-opts": {"max-size": "100m", "max-file": "5"} in /etc/docker/daemon.json.
Anwendungs-Logs in /var/log/meinapp/
/var/log/meinapp/*.log {
daily
rotate 14
size 50M
compress
delaycompress
missingok
notifempty
create 0640 meinapp meinapp
sharedscripts
postrotate
systemctl reload meinapp 2>/dev/null || true
endscript
}
Datumsbasierte Dateinamen mit dateext
Standardmäßig fügt logrotate numerische Suffixe hinzu: access.log.1, access.log.2.gz. Aktivieren Sie dateext für lesbare Datumsstempel:
/var/log/nginx/*.log {
daily
rotate 30
dateext
dateformat -%Y-%m-%d
compress
delaycompress
missingok
}
Dies erzeugt Dateinamen wie access.log-2026-03-22.gz.
Konfiguration Testen
Trockenlauf (Sicher)
sudo logrotate -d /etc/logrotate.d/nginx
Rotation Erzwingen
sudo logrotate -f /etc/logrotate.d/nginx
Ausführlicher Modus
sudo logrotate -v /etc/logrotate.conf
Ergebnis prüfen:
ls -lh /var/log/nginx/
cat /var/lib/logrotate/status | grep nginx
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Rotation läuft, aber Logs wachsen weiter | notifempty überspringt leere Logs, oder App respektiert Reload nicht | Prüfen Sie ob das Log Inhalt hat; verifizieren Sie, dass die App Dateien mit systemctl reload erneut öffnet |
| Unsichere Berechtigungen im übergeordneten Verzeichnis | logrotate verweigert Verzeichnisse, die für alle beschreibbar sind | Berechtigungen korrigieren: chmod o-w /var/log/meinapp |
| Rotierte Dateien nicht komprimiert | compress fehlt, oder Verwendung ohne delaycompress | Fügen Sie delaycompress hinzu, um im nächsten Zyklus zu komprimieren |
| SELinux blockiert Rotation | Falscher SELinux-Kontext bei rotierten Dateien | Führen Sie restorecon -v /var/log/meinapp/*.log aus |
| Beschädigte Statusdatei | Manuelle Bearbeitungen oder Dateisystemfehler | Löschen Sie /var/lib/logrotate/status — logrotate erstellt sie automatisch neu |
postrotate-Skript schlägt stillschweigend fehl | Exit-Code ungleich null | Fügen Sie ` |
Vergleich: Logrotate vs. Andere Ansätze
| Werkzeug | Mechanismus | Am Besten Für |
|---|---|---|
| logrotate | Cron-ausgelöste Dateirotation mit konfigurierbaren Regeln | Traditionelle Syslog-/App-Log-Dateien in /var/log/ |
| systemd-journald | Binäres Journal mit SystemMaxUse- und MaxFileSec-Limits | Journal-Einträge von systemd-Diensten (journalctl) |
| rsyslog integriert | om file-Modul mit Rotationsdirektiven | Umgebungen mit zentralisierter Log-Weiterleitung via rsyslog |
| Docker-Logging-Treiber | json-file-Treiber mit max-size und max-file | stdout/stderr-Logs von Docker-Containern |
| Fluentd / Vector | Logs an Remote-Speicher senden; keine lokale Rotation | Cloud-native Umgebungen mit zentralisierter Log-Aggregation |
Zusammenfassung
- Logrotate wird täglich via
/etc/cron.daily/logrotateausgeführt und verwendet/var/lib/logrotate/status, um Rotationszeitpunkte zu verfolgen. - Globale Standardwerte stehen in
/etc/logrotate.conf; App-spezifische Konfigurationen gehören in/etc/logrotate.d/. - Verwenden Sie
postrotatemitsystemctl reloadoderkill -USR1wann immer möglich — bevorzugen Sie es gegenübercopytruncate. - Fügen Sie
delaycompresszusammen mitcompresshinzu, um Dateien nicht zu komprimieren, die noch von laufenden Prozessen offen gehalten werden. - Verwenden Sie
size,minsizeodermaxsizefür Dienste, die unerwartet hohe Log-Volumina erzeugen können. - Testen Sie immer mit
logrotate -d, bevor Sie eine neue Konfiguration in die Produktion deployen. - Datumsbasierte Dateinamen (
dateext) erleichtern das Verwalten und Prüfen von Log-Archiven erheblich.