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

DirektiveWirkung
daily / weekly / monthlyRotationsfrequenz
rotate NAnzahl der aufzubewahrenden rotierten Dateien vor dem Löschen
compressRotierte Dateien mit gzip komprimieren
delaycompressDie vorherige Rotation komprimieren, nicht die gerade rotierte
missingokStillschweigend überspringen, wenn die Log-Datei fehlt
notifemptyNicht rotieren, wenn das Log leer ist
create Modus Eigentümer GruppeNach der Rotation eine neue leere Log-Datei erstellen
sharedscriptspostrotate einmal für alle übereinstimmenden Dateien ausführen
dateextDatum statt Zahl an den Namen der rotierten Datei anhängen
size N / minsize N / maxsize NRotation 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

ProblemUrsacheLösung
Rotation läuft, aber Logs wachsen weiternotifempty überspringt leere Logs, oder App respektiert Reload nichtPrüfen Sie ob das Log Inhalt hat; verifizieren Sie, dass die App Dateien mit systemctl reload erneut öffnet
Unsichere Berechtigungen im übergeordneten Verzeichnislogrotate verweigert Verzeichnisse, die für alle beschreibbar sindBerechtigungen korrigieren: chmod o-w /var/log/meinapp
Rotierte Dateien nicht komprimiertcompress fehlt, oder Verwendung ohne delaycompressFügen Sie delaycompress hinzu, um im nächsten Zyklus zu komprimieren
SELinux blockiert RotationFalscher SELinux-Kontext bei rotierten DateienFühren Sie restorecon -v /var/log/meinapp/*.log aus
Beschädigte StatusdateiManuelle Bearbeitungen oder DateisystemfehlerLöschen Sie /var/lib/logrotate/status — logrotate erstellt sie automatisch neu
postrotate-Skript schlägt stillschweigend fehlExit-Code ungleich nullFügen Sie `

Vergleich: Logrotate vs. Andere Ansätze

WerkzeugMechanismusAm Besten Für
logrotateCron-ausgelöste Dateirotation mit konfigurierbaren RegelnTraditionelle Syslog-/App-Log-Dateien in /var/log/
systemd-journaldBinäres Journal mit SystemMaxUse- und MaxFileSec-LimitsJournal-Einträge von systemd-Diensten (journalctl)
rsyslog integriertom file-Modul mit RotationsdirektivenUmgebungen mit zentralisierter Log-Weiterleitung via rsyslog
Docker-Logging-Treiberjson-file-Treiber mit max-size und max-filestdout/stderr-Logs von Docker-Containern
Fluentd / VectorLogs an Remote-Speicher senden; keine lokale RotationCloud-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