logrotate
logrotate steuert die Rotation von Protokolldateien.
Ein Linux-System löscht eine Protokolldatei normalerweise nicht einfach, sondern rotiert sie. Dazu wird eine Datei "xxx.log" zuerst in "xxx.log.0" (oder ähnlich) umbenannt. Das ist notwendig, weil das automatische Aufräumprogramm nicht weiss, ob und welche anderen Prozesse die Logdatei gerade geöffnet haben. Mit dem Öffnen einer Datei hat ein Prozess nämlich ein Dateihandle auf genau diese Datei erhalten und schreibt immer in sie - gleichgültig ob ein anderer Prozess sie zwischenzeitlich umbenannt oder sogar gelöscht hat.
Nach dem Umbenennen sollte das automatische Aufräumprogramm die Logdateien deshalb neu (leer) anlegen und danach alle Prozesse informieren, dass sich die Protokolldateien geändert haben. Die schreibenden Prozesse müssen daraufhin ihre jeweiligen Logdateien schliessen (die Dateihandles aufgeben) und neu öffnen, worauf sie die aktuelle (noch leere) Version der Datei erhalten und füllen dürfen.
Daneben gibt es noch eine andere Strategie ("copytruncate"). Bei ihr wird die alte Logdatei zuerst ebenfalls für die Archivierung kopiert, danach allerdings nicht gelöscht, sondern auf die Länge null gekürzt. So ändert sich das Dateihandle für den loggenden Prozess nicht, er muss also weder benachrichtigt werden, noch muss er eine neue, leere Datei anlegen.
logrotate ist unter Linux und Freebsd weit verbreitet. Bei Debian dagegen kümmert sich das Sys(k)log-Paket in einem eigenen über Cron aufgerufenen Skript um die Rotation der alten Logdateien.
Konfiguration
logrotate benutzt eine modulare Konfiguration. Die Kernvariablen setzt die zentrale Konfigurationsdatei "/etc/logrotate.conf", welche vermerkt, wie oft Dateien rotiert werden sollen, wie lange die alten Protokolle aufbewahrt werden sollen, ob sie komprimiert werden sollen usw.
Zusätzlich darf jedes installierte Softwarepaket bei seiner Installation einen Eintrag in die Konfigurationsdatei von logrotate machen - allerdings nicht in die zentrale Konfigurationsdatei "/etc/logrotate.conf", sondern ins Verzeichnis "/etc/logrotate.d". Dort hinein schreiben Pakete ihre Konfigurationsdatei mit dem Namen des jeweiligen Pakets. In dieser Datei steht dann auch, was zu tun ist, wenn die Logdatei rotiert ist. Für die Paketverwaltungssoftware dpkg heisst die Konfigurationsdatei also beispielsweise "/etc/logrotate.d/dpkg".
Beispiel "/etc/logrotate.conf"
weekly # wöchentliche Rotation rotate 4 # Es werden 4 Vorversionen aufbewahrt. create # Nach der Rotation wird eine neue (leere) Logdatei # angelegt. compress # Kompression der Vorversion der rotierten Logdatei. include /etc/logrotate.d # Pakete schreiben ihre Roationsinformationen ins # Verzeichnis "/etc/logrotate.d". include ignoriert # dabei alle Backupdateien von Editoren, Dateien von # Versionskontrollsystemen, Reste der Arbeit von # Paketmanagern (etwa "*.rpmsave" oder "*.dpkg-old") # sowie Dateien mit der Endung ".disabled". /var/log/wtmp { # konkrete Datei (wtmp), die logrotate verwalten soll missingok monthly # monatliche Rotation (abweichend vom Standard) create 0664 root utmp # die neu angelegte Datei wird Benutzer "root" und # Gruppe "utmp" übereignet rotate 1 # es wird nur 1 Vorversion aufbewahrt }
Beispiel "/etc/logrotate.d/apache2"
Besondere Optionen für die Rotation der Apache-Logdateien. Zuerst gelten für alle Dateien im Verzeichnis "/var/log/apache2/" die Voreinstellungen aus der zentralen Konfigurationsdatei "/etc/logrotate.conf": die Logdateien werden also wöchentlich rotiert, nach einer weiteren Woche komprimiert und nach der Rotation neu angelegt.
/var/log/apache2/*.log { # Pfadangabe der Logdateien missingok rotate 52 # Es werden 52 Vorversionen aufbewahrt. notifempty # Wenn Apache mal aus einem Grund gar nicht starten # will und darum keine Logdatei anlegt, so wird auch # nicht rotiert. create 640 root adm # Die neu angelegte Datei wird Benutzer "root" und # der Gruppe "adm" übereignet. sharedscripts # logrotate ruft das (nach "postrotate") folgende # Skript nur einmal auf, auch wenn mehrere Logdateien # (normalerweise mindestens ein Access- und ein # Error-Log) rotieren. Es wird gestartet, sobald die # Rotation aller Logdateien abgeschlossen ist. postrotate # Die Art, wie Apache über die erfolgte Rotation # informiert wird. In diesem Falle: Falls Apache läuft # (also seine PID-Datei vorhanden ist) wird er durch # das zugehörige init-Skript neu gestartet. if [ -f /var/run/apache2.pid ]; then /etc/init.d/apache2 restart > /dev/null fi endscript }