LOGROTATE — LOG-LEBENSZYKLUS-VERWALTUNG Wachsendes Log access.log 2.4 GB Disk: 95% logrotate Rotieren Komprimieren Alte bereinigen App signalisieren Rotierte Dateien access.log (neu) access.log.1.gz 120K access.log.2.gz 115K access.log.3.gz 118K Disk: 12% Timer systemd logrotate.timer Taegl. Ausloesung Konfig /etc/logrotate.conf /etc/logrotate.d/ Regeln pro App Automatisierter Log-Lebenszyklus: rotieren, komprimieren, bereinigen, wiederholen

Log-Dateien wachsen im Hintergrund jedes Linux-Servers still und leise. Webserver, Anwendungsframeworks, Datenbanken und System-Daemonen schreiben kontinuierlich in Log-Dateien. Ohne Kontrolle verbrauchen diese Dateien den gesamten verfuegbaren Speicherplatz und verursachen letztendlich Dienstausfaelle, fehlgeschlagene Schreibvorgaenge und verschlechterte Leistung. Logrotate ist das Standard-Werkzeug unter Linux, das dieses Problem loest, indem es alte Log-Dateien automatisch nach einem von Ihnen definierten Zeitplan rotiert, komprimiert und entfernt.

Diese Anleitung behandelt alles, was Sie benoetigen, um logrotate effektiv zu konfigurieren: die globale Konfiguration, anwendungsspezifische Konfigurationen, Nginx-spezifische Einrichtungen, Postrotations-Skripte und die Fehlerbehebung, wenn etwas schiefgeht.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie Folgendes haben:

  • Einen Linux-Server mit Ubuntu 20.04, 22.04 oder 24.04 (die Anweisungen gelten auch fuer Debian und die meisten RHEL-basierten Distributionen)
  • Terminalzugriff mit sudo-Berechtigungen
  • Grundlegende Vertrautheit mit der Kommandozeile und Textbearbeitung (nano oder vim)
  • Log-Dateien, die verwaltet werden muessen (Webserver-, Anwendungs- oder System-Logs)

Was ist Logrotate?

Logrotate ist ein Systemwerkzeug, das die Verwaltung von Log-Dateien vereinfacht. Es automatisiert die Rotation, Komprimierung und Loeschung von Log-Dateien, damit diese Ihr Dateisystem nicht vollstaendig belegen. Logrotate ist auf praktisch jeder Linux-Distribution vorinstalliert und ist seit Jahrzehnten das Standard-Werkzeug zur Log-Verwaltung.

Was logrotate macht:

  • Rotiert Log-Dateien, indem es sie mit einem numerischen Suffix oder Zeitstempel umbenennt
  • Komprimiert alte Log-Dateien mit gzip (oder anderen Algorithmen), um Speicherplatz zu sparen
  • Entfernt Log-Dateien, die aelter als eine festgelegte Anzahl von Rotationen sind
  • Signalisiert Anwendungen, ihre Log-Dateien nach der Rotation erneut zu oeffnen
  • Fuehrt benutzerdefinierte Skripte vor oder nach der Rotation aus
# Verify logrotate is installed
logrotate --version

# Expected output:
# logrotate 3.21.0

Warum Log-Rotation wichtig ist

Ohne Log-Rotation kann ein ausgelasteter Nginx-Server mit 50.000 Anfragen pro Tag Zugriffslogs erzeugen, die taeglich um Hunderte von Megabyte wachsen. Ueber Wochen oder Monate erreichen diese Dateien Gigabyte-Groesse. Die Folgen sind vorhersehbar:

  • Festplatte voll — Dienste stuerzen ab, wenn das Dateisystem 100% Kapazitaet erreicht
  • Langsame Log-Analyse — Werkzeuge wie grep und awk werden bei Multi-Gigabyte-Dateien unpraktisch
  • Aufgeblaehte Backups — Unkomprimierte Logs vergroessern Backup-Groessen und Uebertragungszeiten
  • Compliance-Risiko — Einige Vorschriften erfordern Log-Aufbewahrungsrichtlinien mit definierten Loeschzeitplaenen

Eine einfache logrotate-Konfiguration verhindert all diese Probleme ohne laufenden Aufwand.

Wie Logrotate funktioniert

Logrotate folgt einem einfachen Ausfuehrungsablauf:

  1. Ein systemd-Timer loest logrotate taeglich aus — Auf modernen Ubuntu-Systemen fuehrt die Unit logrotate.timer den logrotate.service einmal taeglich aus. Auf aelteren Systemen uebernahm ein Cron-Job unter /etc/cron.daily/logrotate diese Aufgabe.

  2. Logrotate liest seine Konfiguration — Es laedt /etc/logrotate.conf (die globale Konfiguration), die alle Dateien unter /etc/logrotate.d/ einschliesst.

  3. Es prueft jede Log-Datei gegen seine Regeln — Basierend auf den Direktiven (daily, size, etc.) bestimmt logrotate, ob jede Log-Datei rotiert werden muss.

  4. Die Rotation findet statt — Die aktuelle Log-Datei wird umbenannt (z.B. wird access.log zu access.log.1), und eine neue leere Datei wird erstellt. Zuvor rotierte Dateien werden umnummeriert (access.log.1 wird zu access.log.2, etc.).

  5. Die Komprimierung wird ausgefuehrt — Rotierte Dateien werden komprimiert (typischerweise mit gzip), wobei delaycompress einen Zyklus wartet, bevor komprimiert wird.

  6. Post-Rotations-Skripte werden ausgefuehrt — Befehle innerhalb der postrotate/endscript-Bloecke werden ausgefuehrt, typischerweise um ein Signal an die Anwendung zu senden, damit sie ihre Log-Datei erneut oeffnet.

Ueberpruefen Sie, ob der Timer aktiv ist:

# Check the systemd timer
systemctl status logrotate.timer

# See when it last ran and when it will run next
systemctl list-timers logrotate

Globale Konfiguration (/etc/logrotate.conf)

Die globale Konfigurationsdatei legt Standard-Direktiven fest, die fuer alle Log-Dateien gelten, sofern sie nicht durch anwendungsspezifische Konfigurationen ueberschrieben werden.

# View the global configuration
cat /etc/logrotate.conf

Eine typische Standardkonfiguration sieht folgendermassen aus:

# /etc/logrotate.conf

# Rotate log files weekly
weekly

# Keep 4 weeks of rotated logs
rotate 4

# Create new (empty) log files after rotating old ones
create

# Use date as a suffix of the rotated file
dateext

# Compress rotated log files
compress

# Packages drop their config snippets into this directory
include /etc/logrotate.d

Wichtige Punkte zur globalen Konfiguration:

  • weekly — Rotiert Logs einmal pro Woche. Dies ist der Standard-Zeitplan.
  • rotate 4 — Behaelt 4 rotierte Dateien, bevor die aelteste geloescht wird. Bei woechentlicher Rotation bedeutet das einen Monat an Logs.
  • create — Erstellt nach der Rotation eine neue leere Log-Datei mit denselben Berechtigungen wie das Original.
  • dateext — Haengt das Datum (z.B. -20260114) anstelle eines numerischen Suffixes an rotierte Dateien an.
  • compress — Komprimiert rotierte Dateien mit gzip.
  • include /etc/logrotate.d — Laedt alle anwendungsspezifischen Konfigurationsdateien aus diesem Verzeichnis.

Anwendungsspezifische Konfigurationen (/etc/logrotate.d/)

Jede Anwendung kann eine eigene logrotate-Konfigurationsdatei in /etc/logrotate.d/ haben. Diese Dateien ueberschreiben die globalen Standardwerte fuer bestimmte Log-Dateien.

# List all application-specific configs
ls -la /etc/logrotate.d/

# Common files you might see:
# apt        dpkg       nginx      rsyslog
# alternatives  cups    samba      ufw

Jede Datei folgt demselben Format: ein Log-Dateipfad (oder Glob-Muster), gefolgt von Direktiven in geschweiften Klammern.

# Example: /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}

Konfigurationsdirektiven erklaert

Logrotate bietet Dutzende von Direktiven, um das Rotationsverhalten genau zu steuern. Hier sind die wichtigsten:

Rotationshaeufigkeit

daily       # Rotate every day
weekly      # Rotate once per week (default)
monthly     # Rotate once per month
yearly      # Rotate once per year

Aufbewahrung

rotate 7    # Keep 7 rotated files before deleting the oldest
maxage 30   # Remove rotated logs older than 30 days

Komprimierung

compress         # Compress rotated files (gzip by default)
delaycompress    # Wait one rotation cycle before compressing
compresscmd /usr/bin/xz    # Use xz instead of gzip
compressoptions "-9"       # Pass options to the compression command
nocompress       # Do not compress rotated files

Dateibehandlung

missingok     # Do not error if the log file is missing
notifempty    # Do not rotate the log if it is empty
create 0640 www-data adm    # Create new file with specific mode, owner, group
copytruncate  # Copy the log and truncate the original (for apps that hold the file open)

Benennung

dateext             # Use date-based suffixes (-20260114)
dateformat -%Y%m%d  # Customize the date format
extension .log      # Preserve the .log extension after the date suffix

Benutzerdefinierte Konfiguration fuer Nginx

Nginx ist einer der haeufigsten Dienste, die eine logrotate-Konfiguration benoetigen. Wenn Nginx aus den offiziellen Paketen installiert wird, enthaelt es normalerweise eine Konfigurationsdatei, aber moeglicherweise muessen Sie sie anpassen.

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    create 0640 www-data adm
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

Was jede Direktive in diesem Kontext bewirkt:

  • /var/log/nginx/*.log — Wendet diese Regeln auf alle .log-Dateien im Nginx-Log-Verzeichnis an
  • daily — Rotiert jeden Tag (ueberschreibt das globale weekly)
  • rotate 14 — Behaelt zwei Wochen rotierter Logs
  • delaycompress — Komprimiert das gestrige Log nicht sofort; dies ermoeglicht Log-Analyse-Werkzeugen, es zuerst zu verarbeiten
  • create 0640 www-data adm — Die neue Log-Datei gehoert www-data mit der Gruppe adm und den Berechtigungen 0640
  • sharedscripts — Fuehrt das postrotate-Skript nur einmal aus, auch wenn mehrere Log-Dateien dem Glob-Muster entsprechen
  • postrotate — Sendet das Signal USR1 an Nginx, welches es anweist, seine Log-Dateien ohne Neustart erneut zu oeffnen

Wichtig: Das USR1-Signal ist spezifisch fuer Nginx. Andere Anwendungen verwenden unterschiedliche Signale oder erfordern einen vollstaendigen Neustart. Konsultieren Sie immer die Dokumentation Ihres spezifischen Dienstes.

Benutzerdefinierte Konfiguration fuer Anwendungslogs

Fuer benutzerdefinierte Anwendungslogs (Rails, Node.js, Django oder jede Anwendung, die eigene Logs schreibt) muessen Sie eine logrotate-Konfiguration von Grund auf erstellen.

# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    dateext
    dateformat -%Y%m%d
    maxage 90
}

Wichtige Entscheidungen fuer Anwendungslogs:

  • copytruncate vs create — Wenn Ihre Anwendung ihre Log-Dateien nicht erneut oeffnen kann (viele Node.js- und Python-Anwendungen halten den Dateideskriptor offen), verwenden Sie copytruncate. Dies kopiert den Inhalt in eine rotierte Datei und kuerzt dann das Original. Es gibt ein kleines Zeitfenster, in dem Log-Zeilen zwischen dem Kopieren und dem Kuerzen verloren gehen koennen, aber fuer die meisten Anwendungen ist dies akzeptabel.

  • rotate 30 mit maxage 90 — Behaelt 30 rotierte Dateien, loescht aber auch alles, was aelter als 90 Tage ist. Die maxage-Direktive bietet ein Sicherheitsnetz.

  • dateext — Verwendet datumsbasierte Namen wie app.log-20260114.gz anstelle von numerischen Namen wie app.log.1.gz. Dies erleichtert das Auffinden von Logs eines bestimmten Datums.

Wenn Ihre Anwendung signalbasiertes Log-Neuoeffnen unterstuetzt:

# /etc/logrotate.d/myapp-with-signal
/var/log/myapp/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    create 0644 appuser appgroup
    sharedscripts
    postrotate
        systemctl kill --signal=HUP myapp.service
    endscript
}

Post-Rotations-Skripte (postrotate/endscript)

Post-Rotations-Skripte sind Bloecke von Shell-Befehlen, die nach Abschluss der Log-Rotation ausgefuehrt werden. Sie sind essenziell, um Anwendungen zu signalisieren, ihre Log-Dateien erneut zu oeffnen.

postrotate
    # This block runs after rotation
    /usr/bin/systemctl reload nginx > /dev/null 2>&1 || true
endscript

Es gibt auch prerotate-Skripte, die vor der Rotation ausgefuehrt werden:

prerotate
    # This block runs before rotation
    if [ -d /etc/logrotate.d/httpd-prerotate ]; then
        run-parts /etc/logrotate.d/httpd-prerotate
    fi
endscript

Wichtige Regeln fuer Rotations-Skripte:

  • Beenden Sie immer mit || true oder ; true, um zu verhindern, dass Skriptfehler logrotate stoppen
  • Verwenden Sie sharedscripts, wenn der Log-Pfad ein Glob-Muster enthaelt — dies stellt sicher, dass der postrotate-Block nur einmal statt einmal pro passender Datei ausgefuehrt wird
  • Halten Sie Skripte minimal und schnell — logrotate blockiert waehrend der Skriptausfuehrung
  • Testen Sie Skripte manuell, bevor Sie sie einer logrotate-Konfiguration hinzufuegen

Gaengige Signal-Muster fuer beliebte Dienste:

# Nginx -- reopen log files
kill -USR1 $(cat /var/run/nginx.pid)

# Apache -- graceful restart
/usr/sbin/apachectl graceful > /dev/null 2>&1

# rsyslog -- reopen log files
/usr/lib/rsyslog/rsyslog-rotate

# systemd service -- generic signal
systemctl kill --signal=HUP myservice.service

Testen und Debuggen

Testen Sie Ihre logrotate-Konfigurationen immer, bevor Sie auf den taeglichen Timer warten.

Debug-Modus (Trockenlauf)

Der Debug-Modus simuliert die Rotation, ohne Aenderungen vorzunehmen. Er zeigt genau, was logrotate tun wuerde:

# Test a specific config file
sudo logrotate -d /etc/logrotate.d/nginx

# Test the entire configuration
sudo logrotate -d /etc/logrotate.conf

Beispiel fuer Debug-Ausgabe:

reading config file /etc/logrotate.d/nginx

Handling 1 logs

rotating pattern: /var/log/nginx/*.log  after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating
considering log /var/log/nginx/error.log
  Now: 2026-01-14 10:00
  Last rotated at 2026-01-13 06:00
  log needs rotating

Rotation erzwingen

Erzwingen Sie eine sofortige Rotation unabhaengig vom Zeitplan:

# Force rotation for a specific config
sudo logrotate -f /etc/logrotate.d/nginx

# Force rotation with verbose output
sudo logrotate -vf /etc/logrotate.d/nginx

Ueberpruefung der Statusdatei

Logrotate speichert, wann jede Log-Datei zuletzt rotiert wurde, in einer Statusdatei:

# View the state file
cat /var/lib/logrotate/status

# You'll see entries like:
# "/var/log/nginx/access.log" 2026-1-14-6:0:0
# "/var/log/nginx/error.log" 2026-1-14-6:0:0
# "/var/log/syslog" 2026-1-13-6:0:0

Wenn logrotate eine Datei nicht rotiert, die Sie erwarten, pruefen Sie diese Statusdatei. Wenn das Datum der letzten Rotation aktuell ist, wird logrotate die Datei ueberspringen, bis das naechste Rotationsintervall abgelaufen ist.

Groessenbasierte vs. zeitbasierte Rotation

Logrotate unterstuetzt sowohl zeitbasierte als auch groessenbasierte Rotation, und Sie koennen sie kombinieren.

Nur zeitbasiert

/var/log/myapp/*.log {
    daily        # Rotate every day regardless of file size
    rotate 7
    compress
}

Nur groessenbasiert

/var/log/myapp/*.log {
    size 100M    # Rotate only when the file exceeds 100 MB
    rotate 5
    compress
}

Kombiniert: Zeitbasiert mit Groessenlimits

/var/log/myapp/*.log {
    daily
    rotate 14
    compress
    maxsize 200M    # Also rotate if file exceeds 200 MB before the daily schedule
    minsize 1M      # Do not rotate if the file is smaller than 1 MB, even on schedule
}

Wichtige Unterschiede:

  • size ersetzt die zeitbasierte Rotation vollstaendig — logrotate prueft nur die Dateigroesse
  • maxsize funktioniert zusammen mit der zeitbasierten Rotation — rotiert nach Zeitplan ODER wenn die Groesse ueberschritten wird, je nachdem was zuerst eintritt
  • minsize verhindert die Rotation kleiner Log-Dateien — das Log muss mindestens diese Groesse haben UND das Zeitintervall muss abgelaufen sein

Fuer Server mit hohem Datenverkehr bietet die Kombination aus daily mit maxsize die beste Balance zwischen vorhersehbaren Zeitplaenen und Speicherplatzschutz.

Referenztabelle der Logrotate-Direktiven

DirektiveBeschreibungBeispiel
dailyRotiert Log-Dateien jeden Tagdaily
weeklyRotiert Log-Dateien einmal pro Wocheweekly
monthlyRotiert Log-Dateien einmal pro Monatmonthly
rotate NBehaelt N rotierte Dateien vor dem Loeschenrotate 7
compressKomprimiert rotierte Dateien mit gzipcompress
delaycompressVerzoegert die Komprimierung um einen Rotationszyklusdelaycompress
missingokErzeugt keinen Fehler, wenn die Log-Datei fehltmissingok
notifemptyRotiert nicht, wenn die Log-Datei leer istnotifempty
create mode owner groupErstellt neue Log-Datei mit angegebenen Attributencreate 0640 www-data adm
copytruncateKopiert das Log und kuerzt dann das Originalcopytruncate
size NRotiert, wenn die Datei N Bytes/KB/MB ueberschreitetsize 100M
maxsize NRotiert nach Zeitplan oder wenn Groesse N ueberschreitetmaxsize 500M
minsize NRotiert nur, wenn die Datei mindestens N gross istminsize 1M
maxage NEntfernt rotierte Dateien, die aelter als N Tage sindmaxage 90
dateextVerwendet datumsbasierte Suffixe fuer rotierte Dateiendateext
sharedscriptsFuehrt postrotate-Skripte nur einmal fuer alle passenden Dateien aussharedscripts
postrotate/endscriptShell-Befehle nach der Rotation ausfuehrenSiehe Beispiele oben
prerotate/endscriptShell-Befehle vor der Rotation ausfuehrenSiehe Beispiele oben
olddir /pfadVerschiebt rotierte Dateien in ein anderes Verzeichnisolddir /var/log/archive
su user groupFuehrt die Rotation als bestimmter Benutzer und Gruppe aussu root adm

Fehlerbehebung

Logrotate rotiert eine Datei nicht

# 1. Check for syntax errors
sudo logrotate -d /etc/logrotate.d/yourconfig

# 2. Verify the log file path matches the glob pattern
ls -la /var/log/myapp/*.log

# 3. Check the state file for the last rotation date
grep "myapp" /var/lib/logrotate/status

# 4. Verify the timer is running
systemctl status logrotate.timer

Berechtigungsfehler

# Check ownership and permissions of the log file
ls -la /var/log/myapp/app.log

# Check that the logrotate config uses the correct su directive
# Add this inside your config block:
su root adm

Speicherplatz wird nach der Rotation nicht freigegeben

Wenn Speicherplatz nach der Rotation nicht freigegeben wird, haelt moeglicherweise eine Anwendung die alte (geloeschte) Datei noch offen:

# Find processes holding deleted files open
sudo lsof +L1 | grep deleted

# Restart the offending service to release the file descriptor
sudo systemctl restart myapp

Dies ist genau das Szenario, in dem copytruncate hilft — es kuerzt die Datei an Ort und Stelle, anstatt sie zu loeschen, sodass der Dateideskriptor gueltig bleibt.

Beschaedigung der Statusdatei

Wenn logrotate sich unberechenbar verhaelt, kann die Statusdatei beschaedigt sein:

# Back up the current state file
sudo cp /var/lib/logrotate/status /var/lib/logrotate/status.bak

# Remove the state file (logrotate will recreate it)
sudo rm /var/lib/logrotate/status

# Force a full rotation to rebuild state
sudo logrotate -f /etc/logrotate.conf

Logs rotiert aber nicht komprimiert

Wenn Sie unkomprimierte .1-Dateien neben komprimierten .2.gz-Dateien sehen, ist dies das erwartete Verhalten, wenn delaycompress aktiviert ist. Die zuletzt rotierte Datei bleibt fuer einen Zyklus unkomprimiert. Wenn Sie sofortige Komprimierung benoetigen, entfernen Sie die delaycompress-Direktive.

Zusammenfassung

Logrotate ist eines dieser Werkzeuge, die still im Hintergrund arbeiten, bis etwas schiefgeht — und wenn es schiefgeht, bedeutet das normalerweise, dass Ihre Festplatte voll ist. 15 Minuten fuer die korrekte Einrichtung der logrotate-Konfigurationen fuer Ihre Anwendungen zu investieren, spart Ihnen spaeter Stunden an Notfall-Festplattenbereinigung.

Die wichtigsten Punkte zum Merken:

  • Die globale Konfiguration unter /etc/logrotate.conf legt Standardwerte fest; anwendungsspezifische Konfigurationen in /etc/logrotate.d/ ueberschreiben diese
  • Verwenden Sie daily mit compress und rotate 14 als vernuenftigen Ausgangspunkt fuer die meisten Dienste
  • Verwenden Sie immer postrotate-Skripte, um Anwendungen zu signalisieren, ihre Log-Dateien erneut zu oeffnen
  • Testen Sie jede Konfiguration mit logrotate -d, bevor Sie sie einsetzen
  • Verwenden Sie copytruncate fuer Anwendungen, die ihre Log-Dateien nicht erneut oeffnen koennen
  • Kombinieren Sie daily mit maxsize fuer Server mit hohem Datenverkehr

Um den Rest Ihres Servers abzusichern, lesen Sie unsere Sicherheitscheckliste fuer Linux-Server: 20 wesentliche Schritte und den Vollstaendigen Leitfaden zum Nginx Reverse Proxy fuer die korrekte Einrichtung von Nginx von Anfang an.