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
grepundawkwerden 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:
-
Ein systemd-Timer loest logrotate taeglich aus — Auf modernen Ubuntu-Systemen fuehrt die Unit
logrotate.timerdenlogrotate.serviceeinmal taeglich aus. Auf aelteren Systemen uebernahm ein Cron-Job unter/etc/cron.daily/logrotatediese Aufgabe. -
Logrotate liest seine Konfiguration — Es laedt
/etc/logrotate.conf(die globale Konfiguration), die alle Dateien unter/etc/logrotate.d/einschliesst. -
Es prueft jede Log-Datei gegen seine Regeln — Basierend auf den Direktiven (daily, size, etc.) bestimmt logrotate, ob jede Log-Datei rotiert werden muss.
-
Die Rotation findet statt — Die aktuelle Log-Datei wird umbenannt (z.B. wird
access.logzuaccess.log.1), und eine neue leere Datei wird erstellt. Zuvor rotierte Dateien werden umnummeriert (access.log.1wird zuaccess.log.2, etc.). -
Die Komprimierung wird ausgefuehrt — Rotierte Dateien werden komprimiert (typischerweise mit gzip), wobei
delaycompresseinen Zyklus wartet, bevor komprimiert wird. -
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 andaily— Rotiert jeden Tag (ueberschreibt das globaleweekly)rotate 14— Behaelt zwei Wochen rotierter Logsdelaycompress— Komprimiert das gestrige Log nicht sofort; dies ermoeglicht Log-Analyse-Werkzeugen, es zuerst zu verarbeitencreate 0640 www-data adm— Die neue Log-Datei gehoertwww-datamit der Gruppeadmund den Berechtigungen0640sharedscripts— Fuehrt das postrotate-Skript nur einmal aus, auch wenn mehrere Log-Dateien dem Glob-Muster entsprechenpostrotate— Sendet das SignalUSR1an 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:
-
copytruncatevscreate— Wenn Ihre Anwendung ihre Log-Dateien nicht erneut oeffnen kann (viele Node.js- und Python-Anwendungen halten den Dateideskriptor offen), verwenden Siecopytruncate. 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 30mitmaxage 90— Behaelt 30 rotierte Dateien, loescht aber auch alles, was aelter als 90 Tage ist. Diemaxage-Direktive bietet ein Sicherheitsnetz. -
dateext— Verwendet datumsbasierte Namen wieapp.log-20260114.gzanstelle von numerischen Namen wieapp.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
|| trueoder; 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:
sizeersetzt die zeitbasierte Rotation vollstaendig — logrotate prueft nur die Dateigroessemaxsizefunktioniert zusammen mit der zeitbasierten Rotation — rotiert nach Zeitplan ODER wenn die Groesse ueberschritten wird, je nachdem was zuerst eintrittminsizeverhindert 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
| Direktive | Beschreibung | Beispiel |
|---|---|---|
daily | Rotiert Log-Dateien jeden Tag | daily |
weekly | Rotiert Log-Dateien einmal pro Woche | weekly |
monthly | Rotiert Log-Dateien einmal pro Monat | monthly |
rotate N | Behaelt N rotierte Dateien vor dem Loeschen | rotate 7 |
compress | Komprimiert rotierte Dateien mit gzip | compress |
delaycompress | Verzoegert die Komprimierung um einen Rotationszyklus | delaycompress |
missingok | Erzeugt keinen Fehler, wenn die Log-Datei fehlt | missingok |
notifempty | Rotiert nicht, wenn die Log-Datei leer ist | notifempty |
create mode owner group | Erstellt neue Log-Datei mit angegebenen Attributen | create 0640 www-data adm |
copytruncate | Kopiert das Log und kuerzt dann das Original | copytruncate |
size N | Rotiert, wenn die Datei N Bytes/KB/MB ueberschreitet | size 100M |
maxsize N | Rotiert nach Zeitplan oder wenn Groesse N ueberschreitet | maxsize 500M |
minsize N | Rotiert nur, wenn die Datei mindestens N gross ist | minsize 1M |
maxage N | Entfernt rotierte Dateien, die aelter als N Tage sind | maxage 90 |
dateext | Verwendet datumsbasierte Suffixe fuer rotierte Dateien | dateext |
sharedscripts | Fuehrt postrotate-Skripte nur einmal fuer alle passenden Dateien aus | sharedscripts |
postrotate/endscript | Shell-Befehle nach der Rotation ausfuehren | Siehe Beispiele oben |
prerotate/endscript | Shell-Befehle vor der Rotation ausfuehren | Siehe Beispiele oben |
olddir /pfad | Verschiebt rotierte Dateien in ein anderes Verzeichnis | olddir /var/log/archive |
su user group | Fuehrt die Rotation als bestimmter Benutzer und Gruppe aus | su 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.conflegt Standardwerte fest; anwendungsspezifische Konfigurationen in/etc/logrotate.d/ueberschreiben diese - Verwenden Sie
dailymitcompressundrotate 14als 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
copytruncatefuer Anwendungen, die ihre Log-Dateien nicht erneut oeffnen koennen - Kombinieren Sie
dailymitmaxsizefuer 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.