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.
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:
- Copy: Logrotate erstellt eine exakte Kopie der aktuellen Logdatei (z. B.
access.logwird nachaccess.log.1kopiert). - 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:
- Öffne die Konfigurationsdatei mit Root-Rechten:
sudo nano /etc/logrotate.d/apache2 - Ersetze die Standardanweisungen (oft
sharedscriptskombiniert mit einempostrotate-Block) durchcopytruncate.
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
}
- Speichere die Datei und teste die Konfiguration auf Syntaxfehler:
sudo logrotate -d /etc/logrotate.d/apache2(Der Parameter-dsteht 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.
| Feature | Vorteil | Nachteil |
| Dienst-Stabilität | Absolut kein Restart/Reload von Apache nötig. | – |
| Datenintegrität | – | Minimaler Datenverlust möglich: In der Millisekunde zwischen Copy und Truncate geschriebene Logs gehen verloren. |
| Einfachheit | Simpler 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.





