logrotate

Apache2 Logrotate ohne Restart: Der Guide zu copytruncate

Jeder Administrator kennt das: Logfiles wachsen unaufhörlich. Standardmäßig verschiebt Logrotate die alte Logdatei und weist Apache über ein Signal (systemctl reload apache2) an, eine neue Datei zu öffnen. Das funktioniert meistens reibungslos, aber in Hochverfügbarkeitsumgebungen oder bei extrem sensiblen Setups möchte man manchmal selbst den kleinsten „Schluckauf“ beim Reload vermeiden.

Hier kommt die Option copytruncate ins Spiel.

bash — logrotate simulation

Wie funktioniert copytruncate technisch?

Normalerweise arbeitet Logrotate nach dem „Move-and-Signal“-Prinzip: Die Datei access.log wird in access.log.1 umbenannt, und der Apache-Prozess wird informiert, dass er ein neues File anlegen soll.

Bei copytruncate bleibt die ursprüngliche Datei physisch immer dieselbe (die Inode ändert sich nicht). Der Ablauf sieht so aus:

  1. Copy: Logrotate erstellt eine exakte Kopie der aktuellen Logdatei (z. B. access.log wird nach access.log.1 kopiert).
  2. Truncate: Direkt nach dem erfolgreichen Kopieren wird die ursprüngliche Logdatei auf 0 Bytes gekürzt (geleert), anstatt sie zu löschen oder zu verschieben.

Da Apache die Datei über einen sogenannten File-Descriptor offen hält, schreibt er einfach weiter in dieselbe Datei. Für den Webserver sieht es so aus, als wäre die Datei plötzlich leer geworden. Ein Reload des Dienstes ist somit nicht erforderlich.


Die Konfiguration: So setzt du es um

Die Konfiguration für Apache-Logs findest du unter Linux normalerweise im Verzeichnis /etc/logrotate.d/apache2. Um auf copytruncate umzustellen, musst du die Datei bearbeiten.

Schritt-für-Schritt-Anleitung:

  1. Öffne die Konfigurationsdatei mit Root-Rechten:sudo nano /etc/logrotate.d/apache2
  2. Ersetze die Standardanweisungen (oft sharedscripts kombiniert mit einem postrotate-Block) durch copytruncate.

Ein fertiges Beispiel könnte so aussehen:

Bash

/var/log/apache2/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 640 root adm

    # Hier ist die entscheidende Zeile:
    copytruncate

    # Der postrotate-Block mit 'reload' kann nun entfernt werden
}
  1. Speichere die Datei und teste die Konfiguration auf Syntaxfehler:sudo logrotate -d /etc/logrotate.d/apache2(Der Parameter -d steht für „Debug“ – es wird nichts verändert, nur simuliert.)

Vor- und Nachteile von copytruncate

Nichts in der IT ist ohne Kompromisse. Hier ist ein kurzer Überblick, wann du diese Methode wählen solltest.

FeatureVorteilNachteil
Dienst-StabilitätAbsolut kein Restart/Reload von Apache nötig.
DatenintegritätMinimaler Datenverlust möglich: In der Millisekunde zwischen Copy und Truncate geschriebene Logs gehen verloren.
EinfachheitSimpler Workflow ohne Signale an Prozesse.Bei extrem großen Logfiles (viele GB) dauert der Kopiervorgang lange.

Wichtig!

Achtung beim Datenverlust: Da der Prozess des Kopierens und anschließenden Leerens nicht absolut atomar ist, können Log-Einträge, die genau in diesem winzigen Zeitfenster eintreffen, im „Nirvana“ landen. Für normale Webseiten ist das vernachlässigbar, für rechtssicheres Logging oder Finanztransaktionen jedoch kritisch.


Fazit

copytruncate ist die ideale Lösung, wenn du Apache2-Logs rotieren willst, ohne den Dienst auch nur für eine Millisekunde durch einen Reload zu beeinflussen. Es ist besonders nützlich für Anwendungen, die empfindlich auf Signal-Handler reagieren oder wenn du eine sehr einfache Logrotate-Logik ohne komplexe Skripte bevorzugst.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen