HOWTO zum Kommando "logrotate" (Logdatei Rotation)

(C) 2014-2018 T.Birnthaler/H.Gottschalk <howtos(at)ostc.de>
              OSTC Open Source Training and Consulting GmbH
              www.ostc.de

$Id: logrotate-HOWTO.txt,v 1.13 2018/04/03 12:45:51 tsbirn Exp $

Diese Dokument beschreibt die Eigenschaften und Möglichkeiten des Programms
"logrotate" zum Rotieren von Logdateien auf Linux-Systemen. Für Informationen
zum System-Logging-Daemon "syslog/syslog-ng/rsyslog" siehe --> syslog-HOWTO.txt

Inhaltsverzeichnis

1) Einleitung
2) Ablauf
3) "logrotate"-Aufruf
4) Zentrale Konfigurations-Datei "/etc/logrotate.conf"
5) Lokale Konfigurations-Dateien im Verzeichnis "/etc/logrotate.d"
6) Konfigurations-Parameter
7) Beispiel-Konfiguration

1) Einleitung   (Toc)

"logrotate" ist ein Werkzeug um Logdateien zu verwalten. Wird Logdateien
keine Beachtung geschenkt, so werden sie immer größer und belegen am Ende den
gesamten verfügbaren Plattenplatz. Weiterhin ist das Durchsuchen vieler/großer
Logdateien zeitaufwendig. Um dies zu verhindern und Platz auf der Festplatte
zu sparen, ist "logrotate" entwickelt worden.

Mit "logrotate" kann man Logdateien ab einer bestimmten Größe (z.B. 1 MByte)
und/oder einem bestimmten Alter (z.B. 1 Tag, 1 Woche, 1 Monat, 1 Jahr) rotieren
lassen. Mit "Rotieren" ist gemeint, dass die aktuelle Logdatei und frühere
Versionen von ihr umbenannt/verschoben und dabei evtl. komprimiert werden. Die
aktuelle Logdatei wird geleert. Frühere Versionen der Logdatei werden dabei
durchnumeriert und ggf. auch gelöscht, sobald sie ein gewisses Alter oder eine
gewisse Anzahl erreichen.

Beispiel zur möglichen Wirkung der Logrotation auf Datei "/var/log/auth.log":

  auth.log.100.gz                       # Löschen
  auth.log.N.gz    --> auth.log.N+1.gz  # Umbenennen (N=2..99)
  auth.log.1       --> auth.log.2.gz    # Komprimieren + umbenennen
  auth.log.0       --> auth.log.1       # Umbenennen
  auth.log         --> auth.log.0       # Umbenennen
  auth.log                              # Leer neu anlegen

2) Ablauf   (Toc)

"logrotate" wird meist periodisch per "cron" gestartet (z.B. 1x am Tag) und
über die Konfigurations-Datei "/etc/logrotate.conf" gesteuert. In dieser Datei
sind GLOBALE Einstellungen hinterlegt. Normalerweise enthält diese Datei auch
einen Eintrag, der "logrotate" anweist, alle Konfigurations-Dateien aus dem
Verz. "/etc/logrotate.d/" ebenfalls einzulesen.

In den Konfigurations-Dateien sind Verz.- und Dateipfade (auch per Shell-Muster
"*", "?" und "[...]") hinterlegt, die rotiert werden sollen. Entweder gelten
für sie die globalen Definitionen (aus "etc/logrotate.conf") oder LOKALE
Definitionen, die zusammen mit ihnen angegeben werden. Die Definitionen legen
fest, auf welche Art und Weise die Logrotation der Dateien erfolgen soll.

Lokale Definitionen überschreiben dabei globale, ebenso überschreiben spätere
Definitionen frühere.

Anschließend wird die Status-Datei "/var/lib/logrotate/status" gelesen. Dort
sind Informationen hinterlegt, wann eine Datei zum letzten Mal rotiert wurde.
Beim ersten "logrotate"-Aufruf wird diese Datei angelegt und alle zu
bearbeitenden Logdateien erhalten das aktuelle Datum als letzten
Bearbeitungszeitpunkt. Anschließend werden Logdateien nicht mehr rotiert, falls
"logrotate" am gleichen Tag erneut aufgerufen wird.

Um eine erneute Rotation am gleichen Tag zu erzwingen, ist das Datum nach den
einzelnen Logdateien in der Statusdatei "/var/lib/logrotate/status" zu ändern
oder die Option -f/--force zu benutzen. Hier ein Ausschnitt aus der
Status-Datei:

  "/var/log/atop.log" 2016-3-29
  "/var/log/atop/dummy_before" 2016-3-29
  "/var/log/samba/log.smbd" 2016-3-27
  "/var/log/mysql/mysql.log" 2016-3-29

3) "logrotate"-Aufruf   (Toc)

Der Aufruf des Programms ("root"-Rechte notwendig) lautet:

  logrotate [OPT] [CONFIGFILE...]

Folgende Optionen OPT sind beim Aufruf möglich (ohne Konfigurations-Datei
CONFIGFILE als letzter Parameter wird "/etc/logrotate.conf" verwendet):

  +-----------------+--------------------------------------------------------+
  | Option          | Bedeutung                                              |
  +-----------------+--------------------------------------------------------+
  | -d              | Keine Änderung, nur Testlauf mit mehr Ausgaben [debug] |
  |                 | (impliziert -v/--verbose)                              |
  | -f --force      | Logdateien rotieren auch falls nicht notwendig         |
  | -m --mail CMD   | Für Mailversand zu verwendendes Kommando               |
  |                 | (STD: /usr/bin/mail -s "SUBJECT" "RECIPIENT" < "TEXT") |
  | -s --state FILE | Statusdatei FILE (STD: "/var/lib/logrotate/status")    |
  | -v --verbose    | Mehr Ausgaben erzeugen                                 |
  |    --usage      | Kurze Hilfemeldung ausgeben                            |
  +-----------------+--------------------------------------------------------+

4) Zentrale Konfigurations-Datei "/etc/logrotate.conf"   (Toc)

Konfigurations-Datei für die GLOBALEN Einstellungen, die standardmäßig für alle
Logdateien gelten. Diese Einstellungen können für einzelne Logdateien durch
LOKALE Einstellungen überschrieben werden. Die Konfiguration ist
zeilenorientiert und besteht aus Schlüsselworten + evtl. einem Wert zum
Schlüsselwort.

Beispiel für den Inhalt von "/etc/logrotate.conf":

  weekly                     # Rotiere wöchentlich
  rotate 4                   # 4 Versionen pro Logdatei aufheben
  create                     # Nach Rotation neue leere Logdatei erzeugen
  compress                   # Rotierte Logdateien komprimieren
  include /etc/logrotate.d   # Alle Dateien aus Verz. ebenfalls einlesen

Die zentrale Konfigurations-Datei kann auch spezielle (lokale) Definitionen zum
Rotieren einzelner Logdateien enthalten. Nach einer Liste von Pfadnamen (durch
Leerzeichen getrennt, Shell-Muster "*", "?" und "[...]" sind erlaubt) der zu
rotierenden Logdateien folgen umgeben von geschweiften Klammern {...} die
Logrotate-Direktiven, die für diese Dateiliste GEMEINSAM gelten sollen (und die
GLOBALEN Direktiven überschreiben).

  /var/log/wtmp {             # Zu rotierende Logdatei
      monthly                 # Monatlich rotieren
      rotate 1                # Nur 1 rotierte Version aufheben
      create 0664 root utmp   # Zugriffsrechte und Besitzer(Gruppe) festlegen
  }

Für die meisten Logdateien werden diese Definitionen aber in getrennte
Konfigurations-Dateien im Unterverz. "/etc/logrotate.d" ausgelagert.

5) Lokale Konfigurations-Dateien im Verzeichnis "/etc/logrotate.d"   (Toc)

Die oben aufgeführte Definition für die Logdatei "/var/log/wtmp" kann auch in
einer separaten Datei im Include-Verz. "/etc/logrotate.d" abgelegt werden. Der
Name dieser Definitions-Datei ist beliebig wählbar, er sollte aber
sinnvollerweise "wtmp" lauten, um den Zusammenhang zu verdeutlichen.

  /var/log/wtmp {             # Zu rotierende Logdatei
      monthly                 # Monatlich rotieren
      rotate 1                # Nur 1 rotierte Version aufheben
      create 0664 root utmp   # Zugriffsrechte und Besitzer(Gruppe) festlegen
  }

Über das Include-Verz. "/etc/logrotate.d" hat man also die Möglichkeit, für
jede Anwendung oder Logdatei eine EIGENE Konfiguration mit sprechendem
Dateinamen zu hinterlegen. Dadurch bleibt die Konfiguration übersichtlich und
änderungsfreundlich.

6) Konfigurations-Parameter   (Toc)

Als GLOBALE und LOKALE Konfigurations-Parameter sind möglich:

  +---------------------+------------------------------------------------------+
  | Direktive           | Bedeutung                                            |
  +---------------------+------------------------------------------------------+
  | include FILE/DIR    | Angegebene Konfigurations-Datei/Verz. lesen           |
  |                     | (Verz. --> ALLE darin vorhandenen Dateien lesen)     |
  +---------------------+------------------------------------------------------+
  | daily               | Tägliches rotieren der Logdateien.                   |
  | weekly              | Wöchentliches rotieren der Logdateien                |
  | monthly             | Monatliches rotieren der Logdateien                  |
  | yearly              | Jährliches rotieren der Logdateien                   |
  +---------------------+------------------------------------------------------+
  | size SIZE           | Logdatei rotieren wenn größer (Byte, k=kilo, M=Mega) |
  | maxage DAYS         | Rotierte Logdateien nach Anzahl Tagen löschen        |
  | rotate CNT          | Max. CNT rotierte Logdateien aufheben                |
  +---------------------+------------------------------------------------------+
  | missingok        no | Fehlende Logdatei wird ignoriert (STD)               |
  | ifempty         not | Auch leere Logdateien rotieren (STD)                 |
  | copytruncate     no | Logdatei nach Kopieren abschneiden (STD: Original    |
  |                     | umbenannt + neues erstellt). Falls Anwendung nicht   |
  |                     | gezwungen werden kann, Logdatei zu schließen.        |
  |                     | (Datenverlust möglich, "create" ohne Wirkung)        |
  +---------------------+------------------------------------------------------+
  | compress            | Rotierte Logdateien packen                           |
  | delaycompress       | Letzte rotierte Version nicht sofort komprimieren    |
  |                     | (erst im übernächsten Rotationszyklus)               |
  | compressext EXT     | Dateinamen-Extension kompr. Dateien (STD: .gz)       |
  | compresscmd CMD     | Komprimier-Kommando (STD: gzip)                      |
  | uncompresscmd CMD   | Dekomprimier-Kommando (STD: gunzip)                  |
  | compressoptions OPT | Optionen für Komprimier-Kommando (STD: LEER)         |
  +---------------------+------------------------------------------------------+
  | create MODE USR GRP | Rechte + Besitzer(-Gruppe) rot. Dateien festlegen    |
  | dateext             | Datum-Stempel statt laufende Nummer anhängen         |
  | extension EXT       | Dateinamen-Extension rotierter Dateien (STD: ?)      |
  |                     | (daran ggfs. noch Komprimier-Extension angehängt)    |
  | olddir DIR          | Rot. Logdateien in DIR ablegen (identische Platte)   |
  +---------------------+------------------------------------------------------+
  | mail ADDRESS        | Zu löschende Logdatei vorher mailen                  |
  | mailfirst           | Neu erstellte rot. Logdatei mailen                   |
  | maillast            | Zu löschende rot. Logdatei mailen (STD)              |
  +---------------------+----+-------------------------------------------------+
  | postrotate ... endscript | Kommandos ... NACH Logdatei-Rotation ausführen  |
  | prerotate ... endscript  | Kommandos ... VOR Logdatei-Rotation ausführen   |
  | sharedscript             | Skript NUR 1x für ALLE Logdateien ausführen     |
  +---------------------+----+-------------------------------------------------+
  | nocompress          | Rotierte Logdateien NICHT komprimieren               |
  | nocopytruncate      | Logdatei nach Kopieren NICHT abschneiden             |
  | nocreate            | Nach Verschieben keine neue Logdatei erzeugen        |
  | nodelaycompress     | Logdatei sofort komprimieren                         |
  | nomail              | Keine Logdatei als Email verschicken                 |
  | nomissingok         | Fehlende Logdatei erzeugt Fehlermeldung (STD)        |
  | noolddir            | Rotierte Logdateien im gleichen Verz. ablegen        |
  | nosharedscripts     | "pre/postrotate"-Skripte PRO Logdatei (STD)          |
  | notifempty          | Leere Logdatei nicht rotieren                        |
  +---------------------+------------------------------------------------------+

HINWEIS: Die Direktiven "postrotate", "prerotate" und "endscript" müssen auf
einer Zeile für sich stehen, die Zeilen dazwischen müssen gültige
Kommandozeilen enthalten.

7) Beispiel-Konfiguration   (Toc)

In "/etc/logrotate.conf" GLOBAL definieren:
* Logdateien wöchentlich rotieren
* 4 rotierte Version verfügbar halten
* Neue leere Logdatei nach dem Verschieben erstellen
* Rotierte Dateien komprimieren
* Konfig.dateien im Verz. "/etc/logrotate.d" berücksichtigen

  weekly
  rotate 4
  create
  compress
  include /etc/logrotate.d

Im Verz. "/etc/logrotate.d" liegt eine Konfigurations-Datei "httpd",
die folgendes festlegt:
* 2 Dateien "/var/log/httpd/access.log" + ".../error.log" rotieren
* 5 rotierte Versionen davon verfügbar halten
* ÄLTESTE rotierte Datei vor Löschen an "log@ostc.de" mailen
* Logdateien rotieren, sobald größer als 100 KB
* "postrotate"-Prozedur nur 1x für die 2 Logdateien ausführen
* Nach Rotieren Prozess "httpd" initialisieren (/sbin/killall -HUP httpd)

  "/var/log/httpd/access.log" /var/log/httpd/error.log {
      rotate 5
      mail log@ostc.de
      size 100k
      sharedscripts
      postrotate
          /sbin/killall -HUP httpd
      endscript
  }

HINWEIS: Dateinamen können Shell-Muster enthalten (KEINE Regulären Ausdrücke)
und mit oder ohne Quotierung per "..." oder '...' angegeben werden.