Linux logrotate
2011-05-25

2018-04-26 12:11:33 Linux,logrotate,DE

logrotate wurde entwickelt um die Verwaltung von Logs zu vereinfachen. Der Dienst ermöglicht es, automatisch Logs zu komprimieren und zu löschen. logrotate kann dies zu verschiedenen Zeitpunkten durchführen.

Übersicht

logrotate wurde entwickelt, um die Verwaltung von Systemen zu vereinfachen, die eine große Anzahl von Logfiles erzeugen. Es ermöglicht das automatische Komprimieren, Entfernen und sogar das Versenden von Logfiles. Jedes Logfile kann täglich, wöchentlich oder monatlich behandelt werden, oder wenn es zu groß wird.

Normalerweise wird logrotate als täglicher CronJob ausgeführt. Es wird ein Logfile nicht mehr als einmal an einem Tag bearbeitet, es sei denn, das Kriterium für ein Logfile basiert auf der Größe desselben und es wird mehr als einmal pro Tag ausgeführt oder es wird die Option -f oder --force verwendet.

Es können beliebig viele Konfigurationsdateien angegeben werden. Spätere Konfigurationsdateien können die in früheren Dateien angegebenen Optionen überschreiben, daher ist die Reihenfolge wichtig, in der die logrotation-Konfigurationsdateien aufgelistet werden. Normalerweise wird eine einzelne Konfigurationsdatei verwendet, welche alle anderen benötigten Konfigurationsdateien enthält.

Falls keine Argumente mit übergeben werden, gibt logrotate Versions- und Copyright-Informationen sowie eine kurze Zusammenfassung der Verwendung aus. Wenn beim rotieren von Logfiles Fehler auftreten, wird logrotate mit einem Status ungleich != Null beendet.

Installation

Eine gesonderte Installation ist in der Regel nicht notwendig, da logrotate bei nahezu allen Distributionen standardmäßig mit an Bord ist.

$ admin1@erazer:~$ whereis logrotate
logrotate: /usr/sbin/logrotate /etc/logrotate.conf /etc/logrotate.d /usr/share/man/man8/logrotate.8.g

$ admin1@erazer:~$ cat /etc/issue
Ubuntu 16.04.4 LTS \n \l

Konfiguration

Zentrale Konfigurationsdatei zu logrotate

/etc/logrotate.conf

Diese braucht in der Regel nicht editiert zu werden. Es ist bspw. ratsam für die gehostete Website eine gesonderte Konfigurationsdatei anzulegen. Mehr dazu im nächsten Abschnitt.

Beispiel /etc/logrotate.conf:

# see "man logrotate" for details
# rotate log files weekly
weekly

# use the syslog group by default, since this is the owning group
# of /var/log/syslog.
su root syslog

# keep 4 weeks worth of backlogs
rotate 4

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
#compress

# packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
    missingok
    monthly
    create 0664 root utmp
    rotate 1
}

/var/log/btmp {
    missingok
    monthly
    create 0660 root utmp
    rotate 1
}

# system-specific logs may be configured here

Spezifische Konfigurationen

Diese liegen in:

/etc/logrotate.d/

Beispiel /etc/logrotate.d/:

root@erazer:/etc/logrotate.d# ll
insgesamt 68
drwxr-xr-x   2 root root  4096 Apr 25 10:38 ./
drwxr-xr-x 169 root root 12288 Apr 25 10:58 ../
-rw-r--r--   1 root root   126 Apr 14  2016 apport
-rw-r--r--   1 root root   173 Apr  5  2016 apt
-rw-r--r--   1 root root    79 Nov 27  2015 aptitude
-rw-r--r--   1 root root   181 Feb 13  2016 cups-daemon
-rw-r--r--   1 root root   107 Nov 21  2015 dbconfig-common
-rw-r--r--   1 root root   232 Jun 10  2015 dpkg
-rw-r--r--   1 root root   155 Mai 19  2016 php7.0-fpm
-rw-r--r--   1 root root   157 Feb 15  2016 pm-utils
-rw-r--r--   1 root root    94 Jan 27  2016 ppp
-rw-r--r--   1 root root   515 Feb  3  2016 rsyslog
-rw-r--r--   1 root root   178 Aug  7  2014 ufw
-rw-r--r--   1 root root   235 Feb 18  2016 unattended-upgrades
-rw-r--r--   1 root root   485 Apr 25 10:38 www

Website Logs rotieren lassen

Hierzu eine Datei namens www im Ordner /etc/logrotate.d/ erstellen.

# touch /etc/logrotate.d/www;

In dieser Konfigurationsdatei gibt man nun alle Logfiles an, die von logrotate behandelt werden sollen. Logfiles in DoubleQuotes " einfassen; Mehrere Logfiles einfach untereinander aufführen (Kein Komma oder Semikolon am Ende schreiben!).

Es ist möglich, hier mit Wildcard Asterisk * zu arbeiten. Dies ist sehr praktisch, wenn man bspw. alle Logfiles, welche mit Suffix log enden, rotiert wissen möchte: So braucht man anstatt des konkreten Namens des Logfiles lediglich *log angeben.

# vim /etc/logrotate.d/www

Inhalt:

"/var/www/www.example.com/application/log/*log"
"/var/www/www.foo.com/log/*log"
{
        daily
        su www-data www-data
        create 640 www-data www-data
        missingok
        notifempty
        rotate 7
        compress
        size=250k
        copytruncate
}

Um Fehlermeldungen wie bspw. parent directory has insecure permissions zu vermeiden, muß darauf geachtet werden, daß logrotate das rotieren mit dem jeweiligen User/Group der zu rotierenden Datei durchführt. In obigen Beispiel ist dies User www-data der Gruppe www-data. Somit muß in der Konfigurationsdatei notiert werden:

su www-data www-data
create 640 www-data www-data

Um sicherzustellen, dass nachdem die alte Logdatei rotiert wurde, mit dem Schreiben der Loginformationen in die neu erstellte Logdatei fortgefahren wird, muß der Befehl copytruncate notiert werden:

copytruncate

logrotate Status

Zeigt, wann logrotate das letzte mal glaufen ist und welche Logfiles dabei bearbeitet wurden

$ more /var/lib/logrotate/status

Beispiel Ausgabe:

logrotate state -- version 2
"/var/www/www.example.com/application/log/error.log" 2018-4-25-10:41:26
"/var/www/www.foo.com/log/default.log" 2018-4-25-10:0:0

logrotate explizit ausführen

Syntax: logrotate {Konfigurationsdatei}

Bsp.: Es soll ausdrücklich allein gemäß Konfigurationsdatei www rotiert werden:

# /usr/sbin/logrotate /etc/logrotate.d/www

Bsp.: logrotate soll standardmäßig ausgeführt werden - berücksichtigt sämtliche Konfigurationen:

# /usr/sbin/logrotate /etc/logrotate.conf

logrotate und cronjob

Entwickelt man bspw. lokal auf einem Computer (oder vagrant / VM), welcher nicht den ganzen Tag läuft, kann es vorkommen, dass logrotate nicht vom System her ausgeführt wird. Die Folge sind nicht-rotierte, stetig anwachsende Logfiles. Um dies zu verhindern, bietet es sich an, logrotate explizit einmal am Tag zu einer Uhrzeit auszuführen, zu der sichergestellt ist, dass der Computer auch läuft.

Starte editieren der Crontab:

# crontab -e

Trage ein:

# Logrotate ausführen
# um 10:00 Uhr jeden Tag
#-----------------------------------------------
0 10 * * * /usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

Wichtig ist bei crontab immer, dass Pfade absolut angegeben werden - so auch der Pfad zur logrotate binary: /usr/sbin/logrotate

logrotate Manpage

$ man logrotate