Log-Dateien rotieren lassen am Beispiel von Webalizer
Auf einem Linux-System werden in der Regel zahlreiche Interaktionen in Log-Dateien notiert. So speichert beispielsweise der Apache-HTTP-Server die Zugriffe und Fehlermeldungen standardmäßig in /var/log/apache_access.log, so dass der Anwender unter anderem die Zugriffe auf eine Webseite auswerten kann. Dies ist sehr nützlich, kann aber zu Problemen führen, da die Log-Dateien sehr groß werden und somit das System zum Absturz führen können.
Wenn man keine Mechanismen einsetzt, welche die Log-Dateien auf einem System verwalten, können diese sehr groß werden, was man an folgendem Beispiel sehr gut sehen kann:
1.9G -rw-r--r-- 1 root root 1.9G Jan 12 19:50 log_pc-erfahrung.de-access_log
124K -rw-r--r-- 1 root root 121K Jan 12 14:11 log_pc-erfahrung.de-error_log
477M -rw-r--r-- 1 root root 476M Jan 12 19:50 log_pce-forum.de-access_log
109M -rw-r--r-- 1 root root 109M Jan 12 19:50 log_pce-forum.de-error_log
Hier sieht man, dass die Log-Datei des Apache-Webserver von PC-Erfahrung.de innerhalb weniger Monate auf 1,9 GB angestiegen ist, was natürlich nicht wünschenswert ist. Es ist nur eine Frage der Zeit, bis die Log-Datei das komplette System in einen instabilen Zustand bringt, da der Speicherplatz aufgebraucht ist. In diesem Fall ist es nun erforderlich, dass die Log-Dateien regelmäßig gesichert und alte Log-Dateien gelöscht werden.
In diesem Artikel wird anhand des Tools Webalizer, welches die Apache-Log-Dateien auswertet und Zugriffstatistiken erstellt, gezeigt, wie man mit dem Programm logrotate die Log-Dateien verwaltet und mit dem Cron-Jobs regelmäßige Wartungen automatisiert durchführt. Dieses Webalizer-Projekt zeigt anhand eines typischen Einsatzgebietes die Genialität des Tools logrotate.
1.) logrotate - Log-Dateien rotieren lassen
Wie wir bereits gesehen haben, schreibt der Apache ununterbrochen in die Log-Datei, so dass diese stets wächst. Das Ziel ist es nun, dass mit der Hilfe von logrotate die aktuelle Log-Datei gesichert und anschließend geleert wird. Logrotate wird also dazu benötigt, die aktuelle Log-Datei zu rotieren.
Die Konfiguration von logrotate erfolgt in der Datei /etc/logrotate.conf. Die Syntax ist relativ einfach, da wir die gewünschte Log-Datei einfach eintragen und in den darauffolgenden geschweiften Klammern festlegen, wie die Log-Dateien behandelt werden sollen:
/var/www/localhost/htdocs/log_pc-erfahrung.de-access_log {
weekly # Wöchentlich rotieren lassen
compress # Gesicherte Log-Dateien komprimieren
rotate 5 # Max. 5 mal rotieren (5 Backups erstellen)
postrotate # Nach dem Rotieren werden Skripte ausgeführt
/bin/killall -HUP apache2 # Neustart von Apache-Prozessen, damit neue Log-Datei genutzt wird
endscript # Ende von postrotate
}
Testweise können wir nun mit dem Befehl logrotate -f /etc/logrotate.conf die Rotation starten. Wir sehen nun, dass die Log-Datei gesichert und geleert wurde:
websrv-gentoo-PD945 ~ # ls -lsh /var/www/localhost/htdocs/
total 304M
...
3.2M -rw-r--r-- 1 root root 3.2M Jan 12 22:58 log_pc-erfahrung.de-access_log
4.0K -rw-r--r-- 1 root root 839 Jan 12 20:30 log_pc-erfahrung.de-access_log.1.gz
28K -rw-r--r-- 1 root root 27K Jan 12 20:30 log_pc-erfahrung.de-access_log.2.gz
141M -rw-r--r-- 1 root root 141M Jan 12 20:13 log_pc-erfahrung.de-access_log.3.gz
Der erste Schritt wurde erfolgreich erledigt, denn die 1,9 GB große Log-Datei des Apache wurde gesichert, komprimiert und anschließend geleert.
Die oben beschriebene Konfiguration führt nun jede Woche einmal die Rotation durch. Maximal fünf Backup-Dateien der Log-Dateien werden gesichert. Die sechste wird automatisch gelöscht.
Logrotate bietet natürlich einige Optionen mehr an:
Optionen
-d Schaltet den Debug-Modus ein.
-f, --force Rotation zu erzwingen, auch wenn sie eigentlich nicht notwendig wäre.
-s, --state Statusdatei Andere Status-Datei verwenden. In der Status Datei wird notiert, wann die letzte Rotation erfolgte.
--usage Hilfe anzeigen
-v, --verbose logrotate ist gesprächig
Einstellungen in der Konfig-Datei logrotate.conf
compress Alte Versionen der Logdateien komprimieren.
compresscmd Angabe, welche Programm zum Komprimieren genutzt wird
uncompresscmd Angabe, welche Programm zum Dekomprimieren genutzt wird
compressext Namenserweiterung der komprimierten Logdateien.
compressoptions Kommandozeilenoptionen für das verwendete Kompressionsprogramm.
copytruncate Schneidet das Logfile auf die Länge 0 ab, nachdem eine Kopie gezogen wurde, anstatt das alte Logfile zu verschieben und ein neues zu erstellen.
daily Logdateien werden täglich rotiert.
delaycompress Verschiebt die Kompression des letzten Logfiles auf den nächsten Rotationszyklus.
extension Erweiterung Logdateien erhalten Namenserweiterung.
ifempty Auch leere Logdateien werden rotiert.
include Datei_oder_Verzeichnis Einbinden weiterer logrotate-Konfigurationen.
mail Adresse Senden der letzten Logfile an die angegebene Mail-Adresse.
mailfirst Wenn das mail-Kommando benutzt wird, wird die rotierte Datei statt der zu löschenden Datei gemailt.
maillast Wenn das mail-Kommando benutzt wird, wird die zu löschende Datei gemailt. (Das ist die Voreinstellung)
missingok Fehlende Logdateien ignorieren
monthly Logdateien monatlich rotieren.
nocompress Logdateien nicht komprimieren.
nocopytruncate Die Orginal-Datei wird nicht abgeschnitten, nachdem eine Kopie erstellt wurde.
nocreate Neue Logdateien werden nicht angelegt.
nodelaycompress Die Kompression der letzten Datei wird nicht auf den nächsten Rotationszyklus verschoben.
nomail Gegenteil von Mail.
nomissingok Gegenteil von missingok
noolddir Logdateien werden in dem Verzeichnis rotiert, in dem auch das Orginal liegt.
nosharedscripts Die prerotate und postrotate Scripts werden für jede Logdatei ausgeführt, die rotiert wird.
notifempty Leere Logdateien werden nicht rotiert.
olddir Verzeichnis Logs werden in das angegebene Verzeichnis verschoben, um sie zu rotieren.
postrotate/endscript Hierzwischen können Bash-Befehle notiert werden. Diese werden nach dem Rotieren durchgeführt.
prerotate/endscript Hierzwischen können Bash-Befehle notiert werden. Diese werden vor dem Rotieren durchgeführt.
rotate Anzahl Logdateien werden Anzahl mal rotiert, bevor sie gelöscht oder gemailt werden.
sharedscripts Wenn sharedscripts angegeben wurde, dann werden die Scripts nur einmal ausgeführt.
size Größe[M|k] Logdateien werden rotiert, wenn sie größer als die angegebene Größe gewachsen sind.
Webalizer - Zugriffstatistiken auswerten
Laut der oben genannten Konfiguration werden die Zugriffstatistiken bis zu fünf Wochen gespeichert. Damit die Webalizer-Auswertungen nicht verloren gehen, die älter als eine Woche sind, müssen wir Webalizer so konfigurieren, dass die alten Auswertungen nicht gelöscht und neue Zugriffe einfach hinzugefügt werden. Das Stichwort lautet "inkrementell" und dafür gibt es auch eine Einstellung in der Webalizer.conf:
Incremental yes
IncrementalName webalizer.current
Wenn diese beiden Optionen aktiviert wurden, merkt sich Webalizer in der Datei webalizer.current den Stand bei der letzten Auswertung und fügt bei der nächsten Auswertung die neuen Werte hinzu, ohne die alten Werte zu löschen. In folgendem Beispiel wird dies deutlich:
Webalizer vor inkrementeller Verarbeitung:
websrv-gentoo-PD945 localhost # webalizer -c htdocs/webalizer-pc-erfahrung.conf
Webalizer V2.01-10 (Linux 2.6.17-gentoo-r7) German
Verwende Protokolldatei /var/www/localhost/htdocs/log_pc-erfahrung.de-access_log (clf)
Erzeuge Dateien in /var/www/localhost/htdocs/web_pc-erfahrung.de/statistik/
Rechnername für Bericht ist 'localhost'
Lese Datei mit historischen Daten... webalizer.hist
Daten des letzten Programmlaufes nicht gefunden...
Erzeuge Bericht für Oktober 2006
Erzeuge Bericht für November 2006
Erzeuge Bericht für Dezember 2006
Speichere Daten des aktuellen Programmlaufes... [01/12/2007 19:44:41]
Erzeuge Bericht für Januar 2007
Erzeuge Zusammenfassung
Speichere historische Daten...
15810930 Einträge (8095 ignoriert, 2 ungültig) in 137.94 Sekunden, 114621/sec
Bei der ersten Auswertung sieht man, dass die Berichte für Oktober, November, Dezember und Januar erstellt.
Webalizer mit inkrementeller Verarbeitung:
websrv-gentoo-PD945 localhost # webalizer -c htdocs/webalizer-pc-erfahrung.conf
Webalizer V2.01-10 (Linux 2.6.17-gentoo-r7) German
Verwende Protokolldatei /var/www/localhost/htdocs/log_pc-erfahrung.de-access_log (clf)
Erzeuge Dateien in /var/www/localhost/htdocs/web_pc-erfahrung.de/statistik/
Rechnername für Bericht ist 'localhost'
Lese Datei mit historischen Daten... webalizer.hist
Lese Daten vom letzten Programmlauf... webalizer.current
Speichere Daten des aktuellen Programmlaufes... [01/12/2007 19:48:17]
Erzeuge Bericht für Januar 2007
Erzeuge Zusammenfassung
Speichere historische Daten...
15811733 Einträge (15810928 ignoriert, 2 ungültig) in 71.72 Sekunden, 220464/sec
Die nächste Auswertung zeigt, dass erst gar keine Berichte für Oktober, November, Dezember erzeugt werden. Nur die neuen Werte aus dem Monat werden eingepflegt. Dieses liest Webalizer aus der webalizer.current aus (Lese Daten vom letzten Programmlauf... webalizer.current).
Cronjob - Webalizer und Logrotate täglich ausführen
Zu guter letzt können wir mit dem Programm vixie-cron täglich logrotate und webalizer automatisch täglich ausführen lassen. Dazu legen wir einfach folgendes Skript in das Verzeichnis /etc/cron.daily/
webalizer -c /var/www/localhost/htdocs/webalizer-pc-erfahrung.conf
webalizer -c /var/www/localhost/htdocs/webalizer-pce-forum.conf
/usr/sbin/logrotate -s /etc/cron.daily/logrotate.status /etc/cron.daily/logrotate.conf
Was passiert nun? In der Datei crontab haben wir festgelegt, dass die Skripte im Verzeichnis /etc/cron.daily/ täglich um 1:30 Uhr ausgeführt werden. Um 1:30 Uhr werden zuerst die Statistiken für die Domains PC-Erfahrung.de und PCE-Forum.de erstellt, d.h es werden wie gewohnt aktuelle Log-Datei ausgelesen.
Anschließend untersucht logrotate, ob die Log-Dateien rotiert werden müssen. Dieses geschieht bekanntlich wöchentlich. Wir haben nun einen Mechanismus, der täglich die Statistiken erstellt und jede Woche die Logdateien rotiert.
Nachtrag
Damit keine Zugriffsdaten aufgrund der zeitlich verschobenen Ausführung von logrotate und webalizer verloren gehen, sollte man in der logrotate.conf festlegen, dass bevor die Log-Dateien ausgewertet werden, webalizer ausgeführt wird. Dies erreicht man mithilfe des Eintrags prerotate (~vor dem Rotieren):
// logrotate.conf
/var/www/localhost/htdocs/log_pc-erfahrung.de-access_log {
weekly
missingok
sharedscripts
rotate 5
prerotate
/etc/cron.daily/webalizer.sh
endscript
postrotate
/bin/killall -HUP apache2
endscript
}