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.14 2019/11/26 19:37:07 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.