Eines der interessantesten (und vielleicht auch wichtigsten) Verzeichnisse in einem Linux-System ist /var/log
. Gemäß dem Filesystem Hierarchy Standard werden die Aktivitäten der meisten im System laufenden Dienste in eine Datei innerhalb dieses Verzeichnisses oder eines seiner Unterverzeichnisse geschrieben.
Solche Dateien sind als Logs bekannt und sind der Schlüssel zur Untersuchung, wie das System arbeitet (und wie es sich in der Vergangenheit verhalten hat). Logs sind auch die erste Informationsquelle, in die Administratoren und Techniker bei der Fehlersuche schauen.
Wenn wir uns den Inhalt von /var/log
auf einem CentOS/RHEL/Fedora und Debian/Ubuntu (zur Abwechslung) ansehen, werden wir die folgenden Log-Dateien und Unterverzeichnisse sehen.
Bitte beachten Sie, dass das Ergebnis in Ihrem Fall etwas anders ausfallen kann, abhängig von den Diensten, die auf Ihrem(n) System(en) laufen und der Zeit, in der sie laufen.
In RHEL/CentOS und Fedora
# ls /var/log
In Debian und Ubuntu
# ls /var/log
In beiden Fällen, können wir beobachten, dass einige der Log-Namen wie erwartet auf „log“ enden, während andere entweder mit einem Datum umbenannt (z. B. maillog-20160822 auf CentOS) oder komprimiert werden (siehe auth.log.2.gz und mysql.log.1.gz unter Debian).
Dies ist kein Standardverhalten, das auf der gewählten Distribution basiert, sondern kann mit Direktiven in den Konfigurationsdateien nach Belieben geändert werden, wie wir in diesem Artikel sehen werden.
Wenn Protokolle ewig aufbewahrt würden, würden sie irgendwann das Dateisystem füllen, in dem sich /var/log befindet. Um das zu verhindern, kann der Systemadministrator ein nettes Dienstprogramm namens logrotate verwenden, um die Protokolle in regelmäßigen Abständen aufzuräumen.
In wenigen Worten: logrotate benennt das Hauptprotokoll um oder komprimiert es, wenn eine Bedingung erfüllt ist (mehr dazu in einer Minute), so dass das nächste Ereignis in einer leeren Datei aufgezeichnet wird.
Zudem entfernt es „alte“ Protokolldateien und behält die neuesten. Natürlich können wir entscheiden, was „alt“ bedeutet und wie oft wir wollen, dass logrotate die Protokolle für uns aufräumt.
Installation von Logrotate unter Linux
Um logrotate zu installieren, verwenden Sie einfach Ihren Paketmanager:
---------- On Debian and Ubuntu ---------- # aptitude update && aptitude install logrotate ---------- On CentOS, RHEL and Fedora ---------- # yum update && yum install logrotate
Es lohnt sich, in der Konfigurationsdatei (/etc/logrotate.conf
) darauf hinzuweisen, dass weitere, spezifischere Einstellungen in einzelnen .conf
Dateien innerhalb von /etc/logrotate vorgenommen werden können.d.
Dies ist dann und nur dann der Fall, wenn die folgende Zeile existiert und nicht auskommentiert ist:
include /etc/logrotate.d
Wir bleiben bei diesem Ansatz, da er uns hilft, Ordnung zu halten, und verwenden für die folgenden Beispiele die Debian-Box.
Konfigurieren Sie Logrotate unter Linux
Da logrotate ein sehr vielseitiges Werkzeug ist, bietet es viele Direktiven, mit denen wir konfigurieren können, wann und wie die Logs rotiert werden und was danach passieren soll.
Lassen Sie uns den folgenden Inhalt in /etc/logrotate.d/apache2.conf einfügen (beachten Sie, dass Sie diese Datei höchstwahrscheinlich selbst erstellen müssen) und jede Zeile auf ihren Zweck hin untersuchen:
/var/log/apache2/* { weekly rotate 3 size 10M compress delaycompress}
Die erste Zeile zeigt an, dass die Direktiven innerhalb des Blocks für alle Logs in /var/log/apache2 gelten:
- weekly bedeutet, dass das Tool versucht, die Logs wöchentlich zu rotieren. Andere mögliche Werte sind täglich und monatlich.
- rotate 3 gibt an, dass nur 3 rotierte Logs aufbewahrt werden sollen. Die älteste Datei wird also beim vierten Durchlauf entfernt.
- size=10M setzt die Mindestgröße, damit die Rotation stattfindet, auf 10M. Mit anderen Worten, jedes Protokoll wird erst dann rotiert, wenn es 10MB erreicht.
- compress und delaycompress sagen, dass alle rotierten Protokolle, mit Ausnahme des jüngsten, komprimiert werden sollen.
Lassen Sie uns einen Trockenlauf durchführen, um zu sehen, was logrotate tun würde, wenn es jetzt tatsächlich ausgeführt würde. Verwenden Sie die Option -d
, gefolgt von der Konfigurationsdatei (Sie können logrotate tatsächlich ausführen, indem Sie diese Option weglassen):
# logrotate -d /etc/logrotate.d/apache2.conf
Die Ergebnisse sehen Sie unten:
Anstatt die Logs zu komprimieren, könnten wir sie nach dem Datum der Rotation umbenennen. Dazu verwenden wir die Direktive dateext
. Wenn unser Datumsformat ein anderes als das standardmäßige yyyymmdd ist, können wir es mit dateformat angeben.
Beachten Sie, dass wir die Rotation sogar verhindern können, wenn das Protokoll mit notifempty leer ist. Außerdem weisen wir logrotate an, das rotierte Protokoll an den Systemadministrator (in diesem Fall [email protected]) zu mailen, damit er es als Referenz verwenden kann (dazu muss ein Mailserver eingerichtet werden, was den Rahmen dieses Artikels sprengen würde).
Wenn Sie E-Mails über logrotate erhalten möchten, können Sie den Postfix-Mailserver wie hier gezeigt einrichten: Postfix Mail Server installieren
Diesmal werden wir /etc/logrotate.d/squid.conf verwenden, um nur /var/log/squid/access.log zu rotieren:
/var/log/squid/access.log { monthly create 0644 root root rotate 5 size=1M dateext dateformat -%d%m%Y notifempty mail [email protected]}
Wie im Bild unten zu sehen ist, musste dieses Log nicht rotiert werden. Wenn jedoch die Größenbedingung erfüllt ist (size=1M), wird das rotierte Protokoll in access.log-25082020 umbenannt (wenn das Protokoll am 25. August 2020 rotiert wurde) und das Hauptprotokoll (access.log) wird mit den Zugriffsrechten 0644 und mit root als Eigentümer und Gruppenbesitzer neu erstellt.
Wenn die Anzahl der Protokolle schließlich 6 erreicht hat, wird das älteste Protokoll an [email protected] gesendet.
Nun nehmen wir an, Sie wollen einen benutzerdefinierten Befehl ausführen, wenn die Rotation stattfindet. Um das zu tun, fügen Sie die Zeile mit einem solchen Befehl zwischen den Direktiven postrotate und endscript ein.
Angenommen, wir wollen eine E-Mail an root senden, wenn eines der Protokolle in /var/log/myservice rotiert wird. Fügen wir die rot markierten Zeilen in /etc/logrotate.d/squid.conf ein:
/var/log/myservice/* {monthlycreate 0644 root rootrotate 5size=1M postrotate echo "A rotation just took place." | mail root endscript}
Zu guter Letzt ist es wichtig zu beachten, dass die Optionen in /etc/logrotate.d/*.conf
im Falle von Konflikten die in der Hauptkonfigurationsdatei überschreiben.
Logrotate und Cron
Standardmäßig legt die Installation von logrotate eine crontab-Datei in /etc/cron.daily mit dem Namen logrotate an. Wie die anderen crontab-Dateien in diesem Verzeichnis wird sie täglich ab 6:25 Uhr ausgeführt, wenn anacron nicht installiert ist.
Ansonsten beginnt die Ausführung um 7:35 Uhr. Um das zu überprüfen, achten Sie entweder in /etc/crontab oder /etc/anacrontab auf die Zeile mit cron.daily.
Zusammenfassung
In einem System, das mehrere Logs erzeugt, kann die Verwaltung dieser Dateien mit logrotate stark vereinfacht werden. Wie wir in diesem Artikel erklärt haben, rotiert, komprimiert, entfernt und verschickt es Protokolle automatisch in regelmäßigen Abständen oder wenn die Datei eine bestimmte Größe erreicht.
Stellen Sie einfach sicher, dass es als Cron-Job ausgeführt wird, und logrotate wird die Dinge für Sie sehr viel einfacher machen. Weitere Details finden Sie in der Manpage.