Linux logrotate
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
- Installation
- Konfiguration
- Website Logs rotieren lassen
- logrotate Status
- logrotate explizit ausführen
- logrotate und cronjob
- logrotate Manpage
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
- man logrotate, debian.org, 2002-11-05, https://manpages.debian.org/jessie/logrotate/logrotate.8.en.html