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
}