Wie man Logdateien mit Logrotate auf Ubuntu 22.04 verwaltet

Einführung

Logrotate ist ein Systemdienstprogramm, das die automatische Rotation und Komprimierung von Protokolldateien verwaltet. Wenn Protokolldateien nicht rotiert, komprimiert und regelmäßig bereinigt würden, könnten sie irgendwann den gesamten verfügbaren Festplattenspeicher auf einem System verbrauchen.

Logrotate ist standardmäßig auf Ubuntu 22.04 installiert und ist so eingerichtet, dass es die Rotationsanforderungen aller installierten Pakete, einschließlich rsyslog, dem standardmäßigen Systemprotokollprozessor, verwaltet.

In diesem Artikel werden wir die Standard-Logrotate-Konfiguration erkunden und anschließend die Protokollrotation für eine fiktive benutzerdefinierte Anwendung konfigurieren.

Voraussetzungen

Dieses Tutorial setzt voraus, dass Sie einen Ubuntu 22.04-Server mit einem nicht-root-Sudo-fähigen Benutzer haben, wie im Ersten Server-Setup mit Ubuntu 22.04 beschrieben.

Logrotate ist auch auf vielen anderen Linux-Distributionen verfügbar, aber die Standardkonfiguration kann sehr unterschiedlich sein. Andere Abschnitte dieses Tutorials sind weiterhin anwendbar, solange Ihre Version von Logrotate ähnlich wie die von Ubuntu 22.04 ist. Befolgen Sie Schritt 1, um Ihre Logrotate-Version zu bestimmen.

Melden Sie sich als Ihr sudo-fähiger Benutzer auf Ihrem Server an, um zu beginnen.

Schritt 1 — Bestätigung Ihrer Logrotate-Version

Logrotate ist standardmäßig auf Ubuntu installiert. Wenn Sie es jedoch installieren müssen, führen Sie die folgenden Befehle aus, um Ihre Paketliste zu aktualisieren und das Paket abzurufen:

  1. sudo apt update
  2. sudo apt install logrotate

Wenn Sie einen nicht-Ubuntu-Server verwenden, stellen Sie zunächst sicher, dass Logrotate installiert ist, indem Sie nach seiner Versionsinformation fragen:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

Wenn Logrotate installiert ist, aber die Versionsnummer signifikant unterschiedlich ist, können Probleme mit einigen der in diesem Tutorial behandelten Konfigurationsoptionen auftreten. Lesen Sie die Dokumentation für Ihre spezifische Version von Logrotate, indem Sie ihre Handbuchseite (man-Seite) lesen:

  1. man logrotate

Sie können auch die Online-Version der Logrotate-Dokumentation konsultieren. Als nächstes betrachten wir die Standardkonfigurationsstruktur von Logrotate auf Ubuntu.

Schritt 2 — Erkunden der Logrotate-Konfiguration

Die Konfigurationsinformationen von Logrotate finden sich im Allgemeinen an zwei Stellen auf Ubuntu:

  • /etc/logrotate.conf: Diese Datei enthält einige Standard-Einstellungen und richtet die Rotation für einige Protokolle ein, die keiner Systempakete gehören. Sie verwendet auch eine include-Anweisung, um Konfigurationen aus jeder Datei im Verzeichnis /etc/logrotate.d einzubinden.
  • /etc/logrotate.d/: Hier platziert jede von Ihnen installierte Paket, die Unterstützung bei der Protokollrotation benötigen, ihre Logrotate-Konfigurationen. Bei einer Standardinstallation sollten bereits Dateien für wichtige Systemwerkzeuge wie apt, dpkg, rsyslog usw. vorhanden sein.

Standardmäßig konfiguriert logrotate.conf wöchentliche Protokollrotationen, mit Protokolldateien, die dem Benutzer root und der Gruppe syslog gehören, wobei vier Protokolldateien auf einmal aufbewahrt werden (rotate 4), und neue leere Protokolldateien werden erstellt, nachdem die aktuelle rotiert wurde (create).

Lassen Sie uns die Logrotate-Konfigurationsdatei eines Pakets im Verzeichnis /etc/logrotate.d betrachten. Lesen Sie die Datei für das Paket-Dienstprogramm apt mit cat:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

Diese Datei enthält Konfigurationsblöcke für zwei verschiedene Protokolldateien im Verzeichnis /var/log/apt/: term.log und history.log. Beide haben die gleichen Optionen. Alle Optionen, die nicht in diesen Konfigurationsblöcken festgelegt sind, erben die Standardwerte oder die in /etc/logrotate.conf festgelegten Werte. Jede Einstellung in einer Logrotate-Datei überschreibt die Standardwerte von Logrotate, die in /etc/logrotate.conf konfiguriert sind. Die für die apt-Protokolle festgelegten Optionen sind:

  • rotate 12: Behalte zwölf alte Protokolldateien. Dies überschreibt die Standardoption rotate 4.
  • monatlich: Rotiere einmal im Monat. Dies überschreibt die Standardoption wöchentlich.
  • komprimieren: Komprimiere die rotierten Dateien. Dies verwendet standardmäßig gzip und führt zu Dateien mit der Endung .gz. Der Komprimierungsbefehl kann mit der Option compresscmd geändert werden.
  • missingok: Schreibe keine Fehlermeldung, wenn die Protokolldatei fehlt.
  • notifempty: Rotiere die Protokolldatei nicht, wenn sie leer ist.

Diese Konfigurationsdateien erben auch das Standardverhalten create, das Logrotate anweist, nach der Rotation neue Protokolle zu erstellen. Dies könnte mit nocreate überschrieben werden, obwohl dies effektiv die meisten anderen Funktionen deaktivieren würde.

Es gibt viele weitere Konfigurationsoptionen. Sie können alles darüber lesen, indem Sie man logrotate in der Befehlszeile eingeben, um die Handbuchseite von Logrotate aufzurufen.

Als nächstes richten wir eine Konfigurationsdatei ein, um Protokolle für einen fiktiven Dienst namens Ihr-Dienst zu verarbeiten.

Schritt 3 — Ein Beispielkonfigurationsdatei einrichten

Um Protokolldateien außerhalb der vorverpackten und vorconfigurierten Systemdienste mit logrotate zu verwalten, haben wir zwei Möglichkeiten:

  1. Erstellen Sie eine neue Logrotate-Konfigurationsdatei und platzieren Sie sie in /etc/logrotate.d/. Diese wird täglich als Benutzer root zusammen mit allen anderen Standard-Logrotate-Jobs ausgeführt.
  2. Erstellen Sie eine neue Konfigurationsdatei und führen Sie sie außerhalb des standardmäßigen Logrotate-Setups von Ubuntu aus. Dies ist nur wirklich notwendig, wenn Sie Logrotate als nicht-root-Benutzer ausführen müssen oder wenn Sie Protokolle häufiger als täglich rotieren möchten (eine hourly-Konfiguration in /etc/logrotate.d/ wäre ineffektiv, da das Logrotate-Setup des Systems nur einmal täglich ausgeführt wird).

Lassen Sie uns diese beiden Optionen anhand einiger Beispielaufstellungen durchgehen.

Hinzufügen von Konfiguration zu /etc/logrotate.d/

Wir möchten die Protokollrotation für einen fiktiven Webserver konfigurieren, der eine access.log und error.log in /var/log/your-app/ ablegt. Er wird als Benutzer und Gruppe www-data ausgeführt.

Fügen Sie eine Konfiguration für die Protokolldateien von your-app zu /etc/logrotate.d/ hinzu, indem Sie zunächst eine neue Datei im Verzeichnis /etc/logrotate.d mit nano oder Ihrem bevorzugten Editor öffnen:

  1. sudo nano /etc/logrotate.d/your-app

Fügen Sie die folgenden Zeilen zu Ihrer neuen Konfigurationsdatei hinzu:

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

Einige der neuen Konfigurationsanweisungen in dieser Datei sind:

  • create 0640 www-data www-data: Dies erstellt eine neue leere Protokolldatei nach der Rotation mit den angegebenen Berechtigungen (0640), dem Besitzer (www-data) und der Gruppe (auch www-data).
  • sharedscripts: Dieses Flag bedeutet, dass Skripte, die zur Konfiguration hinzugefügt werden, nur einmal pro Durchlauf ausgeführt werden, anstatt für jede rotierte Datei. Da der Pfad /var/log/your-app/*.log ein Platzhalter * enthält, würde diese Konfiguration eine beliebige Anzahl von Protokolldateien im Verzeichnis your-app übereinstimmen. Ohne die Option sharedscripts würde das im postrotate angegebene Skript jedes Mal ausgeführt, wenn logrotate eine Protokolldatei ohne diese Option verarbeitet.
  • postrotate zu endscript: Dieser Block enthält ein Skript, das nach der Rotation der Protokolldatei ausgeführt wird. In diesem Fall laden wir unsere Beispielanwendung neu. Dies ist manchmal erforderlich, um Ihre Anwendung auf die neu erstellte Protokolldatei umzuschalten.
    Beachten Sie, dass postrotate vor der Komprimierung von Protokollen ausgeführt wird. Die Komprimierung kann lange dauern, und Ihre Software sollte sofort zur neuen Protokolldatei wechseln. Für Aufgaben, die ausgeführt werden müssen nach der Komprimierung von Protokollen, verwenden Sie stattdessen den lastaction-Block.

Um zu speichern und nano zu beenden, drücken Sie Strg+X und geben dann Y und anschließend Eingabetaste ein. Sie können die Konfigurationsdatei testen, indem Sie eine Trockenlauf durchführen:

  1. sudo logrotate /etc/logrotate.conf --debug

Dieser Befehl ruft logrotate auf, zeigt auf die Standardkonfigurationsdatei und schaltet den Debug-Modus ein.

Informationen werden darüber ausgegeben, welche Protokolldateien Logrotate bearbeitet und was es mit ihnen getan hätte. Wenn alles gut aussieht, bist du fertig. Der Standard-Logrotate-Job wird einmal täglich ausgeführt und deine neue Konfiguration einschließen.

Als nächstes werden wir eine Einrichtung versuchen, die die Standardkonfiguration von Ubuntu überhaupt nicht verwendet.

Schritt 4 — Erstellen einer unabhängigen Logrotate-Konfiguration

In diesem Beispiel haben wir eine App, die unter unserem Benutzer sammy läuft und Protokolle generiert, die in /home/sammy/logs/ gespeichert sind. Wir möchten diese Protokolle stündlich rotieren, daher müssen wir dies außerhalb der von Ubuntu bereitgestellten Struktur /etc/logrotate.d einrichten.

Zuerst erstellen wir eine Konfigurationsdatei in unserem Home-Verzeichnis. Öffne sie in einem Texteditor:

  1. nano /home/sammy/logrotate.conf

Dann füge die folgende Konfiguration ein:

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

Speichere und schließe die Datei. Wir sind all diese Optionen bereits in früheren Schritten begegnet, aber lassen uns zusammenfassen: Diese Konfiguration wird die Dateien stündlich rotieren, sie komprimieren und vierundzwanzig alte Protokolle behalten und eine neue Protokolldatei erstellen, um die rotierte zu ersetzen.

Du musst die Konfiguration an deine Anwendung anpassen, aber das ist ein guter Anfang.

Um zu testen, ob die Konfiguration funktioniert, erstellen wir eine Protokolldatei. Gehen Sie zunächst mit dem Befehl cd ~ zum Home-Verzeichnis Ihres Benutzers. Erstellen Sie dann mit dem Befehl mkdir ein Verzeichnis für die Protokolle. Erstellen Sie schließlich eine leere Datei im Verzeichnis logs mit dem Befehl touch. Führen Sie die folgenden Befehle aus, um diese Schritte abzuschließen:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

Jetzt, da wir eine leere Protokolldatei am richtigen Ort haben, führen wir den Befehl logrotate aus.

Da die Protokolle im Besitz von sammy sind, müssen wir kein sudo verwenden. Wir müssen jedoch eine Zustands-Datei angeben. Diese Datei protokolliert, was logrotate gefunden hat und welche Aktionen es beim letzten Ausführen ausgeführt hat, damit es beim nächsten Mal weiß, was zu tun ist. Diese Zustandsverfolgung wird für uns behandelt, wenn die Standardkonfiguration /etc/logrotate.conf verwendet wird. Die Zustandsdatei wird in /var/lib/logrotate/status gespeichert. Da wir die Standardkonfiguration nicht verwenden, müssen wir den Speicherort der Zustandsdatei manuell konfigurieren.

Wir lassen Logrotate die Zustandsdatei für dieses Beispiel direkt in unserem Home-Verzeichnis platzieren. Es kann überall platziert werden, wo es zugänglich und bequem ist. Führen Sie den folgenden Befehl aus, um die von Ihnen erstellte /home/sammy/logrotate.conf zu verwenden und den Zustand zu protokollieren, den logrotate findet:

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

Die --verbose-Flagge gibt detaillierte Informationen darüber aus, was Logrotate tut. In diesem Fall wurde nichts rotiert. Das ist das erste Mal, dass Logrotate diese Protokolldatei findet, und sie ist null Stunden alt, also sollte sie nicht rotiert werden.

Wenn wir die Zustandsdatei mit dem cat-Dienstprogramm untersuchen, werden wir feststellen, dass Logrotate einige Informationen über den Durchlauf aufgezeichnet hat:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate hat die Protokolle notiert, die es gesehen hat, und wann es sie zuletzt zur Rotation in Betracht gezogen hat. Wenn wir diesen Befehl eine Stunde später ausführen, wird das Protokoll wie erwartet rotiert werden.

Wenn Sie Logrotate zwingen möchten, das Protokolldatei zu rotieren, wenn es es sonst nicht getan hätte, verwenden Sie das --force-Flag:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

Dies ist nützlich beim Testen von postrotate und anderen Skripten.

Zuletzt müssen wir einen Cron-Job einrichten, um Logrotate jede Stunde auszuführen. Öffnen Sie die Crontab Ihres Benutzers:

  1. crontab -e

Dies öffnet eine Textdatei. Wenn es das erste Mal ist, dass Sie cron verwenden, werden Sie möglicherweise aufgefordert, einen Standard-Texteditor auszuwählen. Wenn Sie keine Präferenz haben, empfehlen wir nano für neue Benutzer. Es können bereits einige Kommentare in der Datei vorhanden sein, die die Cron-Syntax erklären. Bewegen Sie den Cursor nach unten zu einer neuen leeren Zeile am Ende der Datei und fügen Sie Folgendes hinzu:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

Diese Aufgabe wird um die 14. Minute jeder Stunde, jeden Tag ausgeführt. Es führt nahezu denselben logrotate-Befehl aus, den wir zuvor ausgeführt haben, obwohl wir logrotate auf seinen vollständigen Pfad /usr/sbin/logrotate erweitert haben, um sicher zu gehen. Es ist eine gute Praxis, vollständige Pfade zu verwenden, wenn Sie Cron-Jobs schreiben. Um mehr über Cron zu erfahren, können Sie unsere anderen Tutorials überprüfen.

Speichern Sie die Datei und verlassen Sie sie. Dadurch wird die Crontab installiert und unsere Aufgabe wird gemäß dem festgelegten Zeitplan ausgeführt.

Wenn wir unser Protokollverzeichnis in etwa einer Stunde erneut überprüfen, sollten wir die rotierte und komprimierte Protokolldatei access.log.1.gz finden (oder .2.gz, wenn Sie Logrotate mit der --force-Flag ausgeführt haben).

Fazit

In diesem Tutorial haben wir unsere Logrotate-Version überprüft, die Standardkonfiguration von Ubuntu Logrotate erkundet und zwei verschiedene Arten von benutzerdefinierten Konfigurationen eingerichtet. Um mehr über die Befehlszeile und Konfigurationsoptionen zu erfahren, die für Logrotate verfügbar sind, können Sie seine Handbuchseite aufrufen, indem Sie man logrotate in Ihrem Terminal ausführen oder die Online-Dokumentation besuchen.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04