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.
  • logrotate installiert (apt install logrotate oder yum install logrotate).
  • Grundlegende Kenntnisse der Kommandozeile und Dienstverwaltung mit systemctl.
  • Root- oder sudo-Zugriff zum Bearbeiten von /etc/logrotate.conf und /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/logrotate ausgefü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 postrotate mit systemctl reload oder kill -USR1 wann immer möglich — bevorzugen Sie es gegenüber copytruncate.
  • Fügen Sie delaycompress zusammen mit compress hinzu, um Dateien nicht zu komprimieren, die noch von laufenden Prozessen offen gehalten werden.
  • Verwenden Sie size, minsize oder maxsize fü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.

Verwandte Artikel