Protokolle mit logrotate unter Ubuntu 16.04 verwalten

Einrichtung von logrotate zur Verwaltung von System- und Anwendungsprotokollen.

Logrotate ist ein Systemwerkzeug für die automatische Rotation, Komprimierung und Bereinigung von Log-Dateien. Ohne eine entsprechende Verwaltung können Logs auf einem dauerhaft laufenden Server nach und nach den gesamten verfügbaren Speicherplatz belegen — logrotate verhindert genau das.

Auf Ubuntu 16.04 ist logrotate vorinstalliert und bereits so konfiguriert, dass es die Log-Rotation für alle Systempakete und Anwendungen übernimmt.

Installation prüfen

logrotate --version

Die Ausgabe sollte in etwa so aussehen:

logrotate 3.8.7

Struktur der Konfiguration

Die Konfiguration von logrotate ist auf zwei Orte verteilt:

  • /etc/logrotate.conf — die zentrale Konfigurationsdatei mit globalen Standardwerten und Vorlagen für Nicht-Systemdateien
  • /etc/logrotate.d/ — ein Verzeichnis mit dienstspezifischen Konfigurationsdateien, die die globalen Standardwerte ergänzen oder überschreiben

Als Beispiel schauen wir uns die eingebaute Konfiguration für apt an:

cat /etc/logrotate.d/apt

Ausgabe:

/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}

Diese Datei definiert Rotationsregeln für term.log und history.log. Alle hier nicht angegebenen Direktiven fallen auf die globalen Standardwerte in /etc/logrotate.conf zurück.

Bedeutung der einzelnen Direktiven:

  • rotate 12 — 12 archivierte Kopien aufbewahren, bevor alte gelöscht werden
  • monthly — einmal im Monat rotieren
  • compress — archivierte Logs komprimieren (standardmäßig gzip)
  • missingok — keinen Fehler ausgeben, wenn die Log-Datei nicht vorhanden ist
  • notifempty — Rotation überspringen, wenn die Log-Datei leer ist

Methode 1 — Konfiguration in /etc/logrotate.d/ ablegen

Dies ist der Standardansatz für die meisten Anwendungen. Die Konfiguration wird täglich als root zusammen mit allen anderen logrotate-Jobs ausgeführt.

Hier ein Beispiel für eine Anwendung, die access.log und error.log nach /var/log/example-app/ schreibt:

sudo nano /etc/logrotate.d/example-app
/var/log/example-app/*.log {
daily
missingok
rotate 14
compress
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload example-app
endscript
}

Bedeutung der einzelnen Direktiven:

  • create 0640 www-data www-data — nach der Rotation eine neue leere Log-Datei mit den Berechtigungen 0640 anlegen, Eigentümer und Gruppe: www-data
  • sharedscripts — das postrotate-Skript nur einmal ausführen, nachdem alle passenden Dateien verarbeitet wurden, und nicht einmal pro Datei
  • postrotate ... endscript — Befehle, die nach der Rotation ausgeführt werden; in diesem Beispiel wird die Anwendung neu geladen, damit sie die neue Log-Datei verwendet

Nach der Konfiguration lässt sich alles im Trockenlauf testen, ohne Änderungen vorzunehmen:

sudo logrotate /etc/logrotate.conf --debug

Dieser Modus gibt eine detaillierte Übersicht darüber aus, was logrotate tun würde — es wird nichts verändert.

Unsere Produkte und Dienste

WebhostingLäuft auf ultraschnellen NVMe-Laufwerken. Geeignet für Websites jeder Komplexität.
Bestellen
VPSFlexible Cloud-Infrastruktur mit vollem Root-Zugriff.
Bestellen
Dedizierte ServerBare-Metal-Server für maximale Leistung.
Bestellen

Methode 2 — Eigene Konfiguration mit cron-Zeitplanung

Wenn eine nicht standardmäßige Rotation benötigt wird — etwa stündlich — empfiehlt es sich, eine Konfiguration außerhalb von /etc/logrotate.d/ anzulegen und sie manuell per cron auszulösen.

In diesem Beispiel läuft die Anwendung als Benutzer newuser und schreibt Logs nach /home/newuser/logs/. Erstellen Sie eine lokale Konfigurationsdatei:

nano /home/newuser/logrotate.conf
/home/newuser/logs/*.log {
hourly
missingok
rotate 24
compress
create
}

Diese Konfiguration rotiert Logs stündlich, bewahrt 24 komprimierte Archive auf und legt jedes Mal eine neue Log-Datei an.

Erstellen Sie das Log-Verzeichnis und eine Testdatei:

cd ~
mkdir logs
touch logs/access.log

Führen Sie logrotate manuell aus und geben Sie dabei eine eigene Status-Datei an:

logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state --verbose --force

Ausgabe:

reading config file /home/newuser/logrotate.conf
Handling 1 logs
rotating pattern: /home/newuser/logs/*.log  hourly (24 rotations)
empty log files are rotated, old logs are removed
considering log /home/newuser/logs/access.log
log does not need rotating

--verbose gibt eine detaillierte Übersicht über alle Aktionen von logrotate aus. --force erzwingt die Rotation unabhängig davon, ob sie fällig ist. --state legt fest, wo logrotate die Aufzeichnung des letzten Laufs speichert.

Prüfen Sie den Inhalt der Status-Datei:

cat /home/newuser/logrotate-state

Ausgabe:

logrotate state -- version 2
"/home/newuser/logs/access.log" 2020-05-18-16:0:0

So verfolgt logrotate, welche Logs es wann zuletzt verarbeitet hat — damit weiß es beim nächsten Lauf genau, was zu tun ist. Führen Sie denselben Befehl eine Stunde später aus, und die Log-Datei wird wie erwartet rotiert.

Automatisierung mit cron

Um logrotate automatisch jede Stunde auszuführen, fügen Sie einen cron-Job hinzu:

crontab -e

Hängen Sie am Ende der Datei folgende Zeile an:

14 * * * * /usr/sbin/logrotate /home/newuser/logrotate.conf --state /home/newuser/logrotate-state

Dieser Job wird täglich zur 14. Minute jeder Stunde ausgeführt.

Hilfe

Bei Fragen oder wenn Sie Unterstützung brauchen, erreichen Sie uns jederzeit über das Ticketsystem — wir helfen Ihnen gern weiter!

Hilfe benötigt?Unsere Ingenieure helfen Ihnen kostenlos bei jeder Frage in wenigen MinutenKontaktieren Sie uns