Tutorial | logrotate unter Linux

von Thomas


Erstellt am 10.11.2021


Linux Tux

Was ist logrotate

Logrotate wird benötigt, um Log Dateien auf Linux System automatisch verarbeiten zulassen. Dabei erledigt logrotate z.B. die Aufgabe, dass eine Log Datei einmal in der Woche komprimiert und anschließend neu erzeugt wird. Das hat den Vorteil, dass ein Log nicht mehrere Gigabyte groß wird. Das Zugriffslog von einem nginx Webserver kann bei einer kleinen Webseite am Tag schnell mehrere Megabyte erreichen. Wird die Log Datei nicht automatisch verarbeitet bzw. komprimiert, kann die Größe über Monate hinweg paar Gigabyte erreichen. Der von der Log Datei verbrauchte Speicherplatz kann für andere Anwendungen genutzt werden - und seinen wir mal ehrlich, wer brauch noch Logeinträge die mehrere Monate alt sind? In diesem Tutorial möchte ich euch die Bedienung von logrotate näher bringen, welches bei Linux Betriebssystemen standardmäßig verwendet wird, um Log Dateien zu verarbeiten.

Installation von logrotate

Logrotate sollte in allen üblichen Linuxsystemen mit dem dazugehörigem Packetmanager installiert werden können. Beispiel unter Debain (wobei gerade unter Debian logrotate vorinstalliert sein sollte):

apt-get install logrotate

Konfiguration von logrotate

Logrotate wird in der Regel in der Datei /etc/logroate.conf konfiguriert. Die Datei wird standardmäßig bei der Installation angelegt und muss nicht groß verändert werden. Die Kommentierungen in der Datei selbst, beschreiben die Konfigurationen sehr gut, sodass ich nicht weiter drauf eingehen möchte. In dem Verzeichnis /etc/logrotate.d finden sich Dateien (z. B. nginx, fail2ban, etc.), die für die Rotation von Log Dateien einzelner Dienste verantwortlich sind. Sie werden über den Eintrag include /etc/logrotate.d in der logroate.conf Datei geladen. Im Folgendem möchte ich euch die Konfiguration für nginx näher erläutern, wobei die Handhabung für andere Beispiele exemplarisch ist. Konfigurationen in diesen Dateien überschreiben die default Werte aus der /etc/logroatet.conf Datei, sofern sie angegeben sind.

/var/log/nginx/*log {
	daily
	missingok
	rotate 3
	notifempty
	dateext
	dateformat -%Y-%m-%d
	create 640 http log
	compress
	sharedscripts
	postrotate
		test ! -r /run/nginx.pid || kill -USR1 `cat /run/nginx.pid`
	endscript
}
  • /var/log/nginx/*log – Gibt das Verzeichnis an, in dem logrotate bei der Ausführung suchen soll. In diesem Beispiel wird jede Datei verarbeitet, die auf log endet, da * eine Wildcard in Linux ist und für jede Zeichenkette steht.
  • daily – Die Logs sollen täglich verarbeitet werden, Alternativen hier sind hourly, weekly, monthly.
  • missingok - Sollte das Logfile nicht vorhanden sein, wird keine Fehlermeldung erzeugt und mit der Verarbeitung fortgefahren.
  • rotate 3 – Beudetet, dass immer drei rotierte Dateien aufgehoben werden. Sollte ein viertes dazu kommen, wird das älteste gelöscht.
  • noifempty – Mit einem leerem Log soll nichts passieren.
  • dateext – Ermöglicht das Hinzufügen eines Datums nach dem rotieren.
  • dateformat - Gibt den String an, der wegen dateext hinzugefügt werden soll.
  • create 640 http log – Erzeugt direkt nach dem Löschen eine neue Log Datei. Dabei wird <mode> <owner> <group> als Dateiberechtigung angegeben.
  • compress – Die rotierten Logs werden mit gzip komprimiert.
  • sharedscripts – Sorgt dafür, dass das Skript nach dem rotieren nur einmal ausgeführt wird.
  • postrotate / endscript – Der Bereich dazwischen wird nach dem rotieren als shell Skript ausgeführt.

Es gibt noch zahlreiche weitere Funktionen die konfiguriert werden können. Am besten sieht man sich dazu direkt die man Page von logrotate an. Die Option delaycompress ist dabei auch sehr interessant. Der Parameter ist dafür verantwortlich, dass eine Komprimierung im nächsten Rotationszyklus erledigt wird.

logrotate ausführen

Um einen Testlauf von logroate ausführen zu lassen, kann folgende Systax verwendet werden:

/usr/sbin/logrotate /etc/logrotate.conf --debug

Dabei sorgt der Parameter --debug dafür, dass ein detailiertes Ablauf eingeblendet ist aber nichts final durchgeführt wird. Dadurch kann die Konfiguration gut getestet werden. Soll logrotate ohne Testlauf ausgeführt werden, kann --debug weggelassen werden.

Da nicht jeden Tag das Kommando manuell angestoßen wird, kann logroate automatisch ausgeführt werden. Bei Debian Derivaten sollte das automatisch nach der Installation der Fall sein. Mit

systemctl status logroate

kann der Status von dem Service geprüft werden. Unter anderen Derivaten, wie z. B. Arch Linux ist logroate nicht vorkonfiguriert. Mittels

systemctl enable logroate

wird unter Arch Linux eine Timer Datei erzeugt, die unter /etc/systemd/system/timers.target.wants zu finden sein sollte. Es muss nur ein logroate.srvice unter /etc/systemd/system konfiguriert werden und der Service funktioniert. Exemplarisch könnte die Service Datei wie folgt aussehen:

[Unit]
Description=Automatic logrotate
After=network-online.target

[Service]
Type=simple
ExecStart=/usr/bin/logrotate /etc/logrotate.conf
TimeoutStopSec=180
KillMode=process
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target