Apache 2.4 Webserver - Logrotation unter Windows

Zuerst die Frage: Wieso sollen Logs überhaupt klein bleiben?

Dafür gibt es gleich mehrere Gründe, wovon einer ausschlaggebend ist.
Hier drei Beispiele:
  • Große Logs sind sehr unübersichtlich. Tritt der Ernstfall ein, hat man den Fehler in einer kleinen Logdatei meist viel schneller gefunden.
  • Schon einmal eine 1GB große Textdatei geöffnet? Nicht jeder Texteditor kann überhaupt mit solch großen Dateien umgehen und diejenigen, die das können, verbrauchen dabei eine enorme Menge an Ressourcen, was gerade auf dem Server zwangsläufig zu Nebenwirkungen führt.
  • Im laufenden Betrieb kann die Datei nicht bearbeitet werden, um z.B. alte Einträge zu löschen und Platz auf der Festplatte / SSD frei zu machen.
Aber der wohl wichtigste Grund ist: Je größer die Logs umso länger benötigt der Apache Webserver um weitere Einträge hinzuzufügen und dementsprechend auch länger bis er die angeforderte Seite ausliefert.

Schritt 1: Logrotation konfigurieren

 Die Entwickler haben für diesen Fall ein Programm hinterlegt, an das der Webserver die Logs weiterleiten kann. In der httpd.conf oder auch in der jeweiligen vHost Konfiguration können mit folgenden Zeilen der Error und Access Log umgeleitet werden. Die Zeitstempelvariablen können z.B. hier nachgesehen werden: http://php.net/manual/de/function.strftime.php.
Hier eine Aufschlüsselung der Parameter:
[ ErrorLog ] [ |bin/rotatelogs.exe -l ] [ C:/Logs/Apache/error.%Y.%m.%d.log ] [ 604800 ]
[welche Art von Log angesprochen wird]
[Übergabe des Logs an rotatelogs.exe]
[Vollständiger Pfad zur zu generierenden Logdatei samt Name und Zeitstempel]
[Häufigkeit der Rotation in Sekunden]

Schritt 2: Alte Logs automatisch löschen

Nun werden für uns zwar in regelmäßigen Abständen neue Logdateien angelegt, aber es wäre doch wünschenswert, dass man nicht über Monate und Jahre hinweg alle Logs sammelt, oder ständig nachsehen muss um alte Dateien löschen. Hier bietet die Windows PowerShell im Zusammenspiel mit dem Windows Scheduler uns die Möglichkeit einzugreifen.
Wir erstellen eine Textdatei mit der Endung ".ps1", z.B. C:\remove_logs.ps1 mit folgendem Inhalt:
Hier eine Aufschlüsselung der Parameter:
[ Get-ChildItem 'C:/Logs/Apache/*.log' ] [ Where {$_.lastwritetime -lt (Get-Date).AddDays(-30)} ] [ Remove-Item -Force ] [ -WhatIf ]
[ Hole mir alle Elemente aus dem Pfad C:/Logs/Apache, welche die Dateiendung .log haben ]
[ aber nur die, die länger als 30 Tage nicht bearbeitet wurden ]
[ Lösche diese; erzwinge es auch, wenn nötig ]
[ was passiert, wenn die vorhergehenden Parameter alle ausgeführt werden?]
Ist der letzte Parameter gesetzt, werden die restlichen nur simuliert, d.h. in diesem Fall: keine Datei wird wirklich gelöscht.
Haben wir das PowerShell-Skript erstellt und getestet, müssen wir nur noch einen Scheduler-Task mit folgender Angebe anlegen, der ein Programm für uns ausführt:
powershell -file "C:\remove_logs.ps1"
Soll ein Apache Webserver unter Windows eingerichtet werden oder wird Support benötigt? Eure TYPO3 Agentur aus Karlsruhe hilft gern!
ErrorLog "|bin/rotatelogs.exe -l C:/Logs/Apache/error.%Y.%m.%d.log 604800"

CustomLog "|bin/rotatelogs.exe -l C:/Logs/Apache/access.%Y.%m.%d.log 86400" common
# Diese folgende Zeile ist zum Testen gedacht. Mit dem Parameter "-WhatIf" am Ende wird nur gefragt, was denn beim Ausführen passieren würde.
Get-ChildItem 'C:/Logs/Apache/*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force -WhatIf

# Folgende Zeile löscht wirklich die Dateien:
Get-ChildItem 'C:/Logs/Apache/*.log' | Where {$_.lastwritetime -lt (Get-Date).AddDays(-30)} | Remove-Item -Force

Kategorien

Devblog

Tags

Devtools

Hat Dir der Artikel gefallen?