Journalctl erklärt: So bändigst du deine Systemlogs.
Mit journalctl lassen sich unter Linux Systemprotokolle effizient verwalten und analysieren. Das Tool bietet Funktionen zur Überwachung von Systemaktivitäten, Fehlersuche sowie Echtzeitprotokollverfolgung und gibt einen detaillierten Einblick in die Protokolldaten. Es ist somit unverzichtbar, um Systemprobleme effektiv zu diagnostizieren.
Was ist journalctl?
journalctl ist ein leistungsfähiges Dienstprogramm zum Abfragen und Anzeigen von Ereignisprotokollen bzw. Logfiles unter Linux. Es ist ein zentraler Bestandteil der System- und Dienstverwaltungs-Suite systemd, die in vielen modernen Linux-Distributionen wie Ubuntu, Fedora und Arch Linux standardmäßig zum Einsatz kommt. Der Name setzt sich aus „journal“ (Protokoll) und „ctl“ (Control) zusammen, was die Funktion als Kontroll- und Analysetool unterstreicht.
Das Tool ermöglicht den Zugriff auf das Systemprotokoll, das von systemd-journald verwaltet wird. Dieses Protokoll ist eine zentrale Sammlung von Meldungen und Ereignissen während des Systembetriebs. Im Gegensatz zu herkömmlichen textbasierten Logs bietet journalctl eine strukturierte Möglichkeit, Protokolldaten in Echtzeit zu durchsuchen, zu filtern und anzuzeigen. Das hilft dir dabei, Probleme schnell zu diagnostizieren und den Systemstatus im Auge zu behalten.
Dazu speichert journalctl die Protokolldateien im Binärformat, da diese kompakter und effizienter als Textdateien sind. Bei großen Datenmengen erlaubt dies eine wesentlich schnellere Suche nach bestimmten Ereignissen. Zudem bieten binäre Protokolldateien durch ihre Struktur einen besseren Schutz vor Manipulationen im Vergleich zu einfachen Text-Logs.
Speicherplatz für Protokolldateien anpassen
Mit journalctl kannst du den Festplatten-Speicherplatz für Protokolle begrenzen und konfigurieren. Das erfolgt über die Einstellungen des systemd-journald-Dienstes in der Datei /etc/systemd/journald.conf. Dort findest du folgende Einträge:
SystemMaxUse: Begrenzt den Speicherplatz für Protokolle im Systemverzeichnis.RuntimeMaxUse: Begrenzt den Speicherplatz im temporären Verzeichnis.
Um die Begrenzung einzustellen, füge folgende Zeilen hinzu oder passe sie an:
[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50MbashDie Beispielwerte (50M) kannst du frei wählen. Nutze Einheiten wie K (Kilobytes), M (Megabytes), G (Gigabytes) oder T (Terabytes). Nach der Bearbeitung muss systemd-journald neu gestartet werden:
sudo systemctl restart systemd-journaldbashNun ist der Speicherplatz begrenzt. Achte darauf, dass das Limit groß genug für wichtige Daten ist, aber nicht zu viel Platz beansprucht. Beachte: Ältere Protokolle werden automatisch gelöscht, sobald das Limit erreicht ist.
Ermitteln der Festplattenbelegung
Bevor du Änderungen vornimmst, prüfe mit dem Flag --disk-usage, wie viel Platz das Journal aktuell belegt:
journalctl --disk-usage
Journals take up 8.0M on disk.bashAlte Protokolleinträge löschen
Sollte das Journal zu groß werden, kannst du alte Einträge manuell entfernen. Dafür gibt es zwei Wege:
Mit --vacuum-size verkleinerst du das Journal auf eine bestimmte Größe. Dabei werden so lange alte Einträge gelöscht, bis der gewünschte Speicherplatz erreicht ist.
sudo journalctl --vacuum-size=1GbashAlternativ nutzt du eine Zeitangabe mit --vacuum-time. Alle Einträge, die älter als der angegebene Zeitraum sind, werden entfernt. Um z. B. nur die Logs des letzten Jahres zu behalten, gibst du Folgendes ein:
sudo journalctl --vacuum-time=1yearsbashWas kann journalctl?
Eine der Stärken von journalctl ist das Filtern von Log-Einträgen nach verschiedenen Kriterien. So findest du gezielt relevante Infos und identifizierst Fehler rascher. Hier sind die wichtigsten Filteroptionen.
Protokolle anzeigen
Mit dem Befehl journalctl siehst du die Protokolle des aktuellen Systems in umgekehrter chronologischer Reihenfolge. Nutze journalctl -f oder journalctl --follow, um Einträge in Echtzeit zu verfolgen – neue Meldungen erscheinen sofort am Bildschirm.
Je nach Laufzeit deines Systems können das zehntausende Zeilen sein. Um den Überblick zu behalten, lässt sich die Ausgabe mit Linux-Befehlen weiter eingrenzen.
Filtern nach Zeit
Mit journalctl kannst du Protokolle auf bestimmte Zeitpunkte einschränken, um die Suche effizienter zu gestalten.
Filtern nach Bootvorgängen
Das Filtern nach Bootvorgängen ist ideal, um Ereignisse eines bestimmten Systemstarts zu analysieren. So grenzt du Fehler auf einen spezifischen Systemzustand ein.
- Aktueller Boot:
journalctl -bzeigt alle Logs seit dem letzten Neustart. - Vergangene Bootvorgänge: Mit
-bund einer Zahl (z. B.journalctl -b 1für den vorletzten Start) rufst du ältere Logs auf. - Liste aller Bootvorgänge:
journalctl --list-bootslistet alle verfügbaren Bootvorgänge inklusive IDs auf.
Bei manchen Distributionen muss das Speichern alter Boot-Logs erst aktiviert werden. Erstelle dazu das Verzeichnis sudo mkdir -p /var/log/journal.
Alternativ bearbeitest du die Konfiguration mit sudo nano /etc/systemd/journald.conf und setzt unter [Journal] den Wert Storage= auf persistent:
. . .
[Journal]
Storage=persistentbashFiltern nach Zeitfenstern
Mit --since und --until grenzt du Einträge auf ein Zeitfenster ein. Nutze das Format YYYY-MM-DD HH:MM:SS. Beispiel für den Zeitraum vom 1. bis 2. Januar 2023:
journalctl --since "2023-01-01 12:00:00" --until "2023-01-02 12:00:00"bashDie Kombination beider Befehle erlaubt auch sehr kurze Intervalle:
journalctl --since 09:00 --until "1 hour ago"bashDu kannst auch Teile des Formats weglassen, um z. B. alle Einträge ab einem Startpunkt zu sehen:
journalctl --since "2023-11-16 15:25:00"bashjournalctl versteht auch relative Begriffe wie yesterday (gestern), today (heute) oder tomorrow (morgen). Für gestrige Logs gibst du ein:
journalctl --since yesterdaybashFiltern nach Nachrichteninteresse
Du kannst die Suche auf bestimmte Aspekte konzentrieren, was bei der Fehlerdiagnose oder Sicherheitsüberprüfung enorm hilft.
Filtern nach Priorität
Nutze die Prioritäten der Protokolleinträge (Name oder Nummer). Je niedriger die Zahl, desto kritischer die Meldung:
- 0: emerg (Notfall)
- 1: alert (Alarm)
- 2: crit (kritisch)
- 3: err (Fehler)
- 4: warning (Warnung)
- 5: notice (Hinweis)
- 6: info (Information)
- 7: debug (Fehlersuche)
Filtere mit -p. Der folgende Befehl zeigt alle Meldungen ab der Stufe „err“ (Error) aufwärts:
journalctl -p errbashFiltern nach Einheit
Um Protokolle spezifischer Dienste (Units) zu sehen, nutze -u. Für den Apache-Webserver lautet der Befehl:
journalctl -u apache2bashKombiniere dies mit Zeitfiltern, um etwa zu prüfen, ob der Dienst heute bereits aktiv war:
journalctl -u apache2 --since todaybashDu kannst auch mehrere Units zusammenführen, etwa wenn Nginx und PHP-FPM zusammenarbeiten:
journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since todaybashFiltern nach Prozess, Benutzer oder Gruppen-ID
Kennst du die PID eines Prozesses, filterst du mit _PID. Beispiel für PID 8088:
journalctl _PID=8088bashAlternativ zeigen _UID oder _GID alle Einträge eines Benutzers oder einer Gruppe. Die ID des Users „www-data“ findest du so:
id -u www-data
33bashNutze die ID dann für den Filter:
journalctl _UID=33 --since todaybashEine Übersicht aller Gruppen-IDs im Journal liefert -F:
journalctl -F _GID
32
99
102
133
81
84
100
0
124
87bashFiltern nach Komponentenfeld
Dies ist ideal, um den Fokus auf spezifische Software-Komponenten zu legen. Um etwa Einträge der ausführbaren Datei bash zu sehen, gibst du ein:
journalctl /usr/bin/bashbashKernel-Meldungen anzeigen
Das Analysieren von Kernel-Meldungen hilft bei der Suche nach Hardware-Problemen oder Treiberkonflikten. Nutze dazu das Flag -k oder (entspricht dmesg):
journalctl -kbashStandardmäßig siehst du den aktuellen Boot. Für die letzten fünf Bootvorgänge gibst du Folgendes ein:
journalctl -k -b -5bashJournalanzeige in journalctl anpassen
Passe die Darstellung an, um Informationen schneller zu erfassen.
Kürzen oder Erweitern der Ausgabe
Standardmäßig nutzt journalctl einen Pager und lässt lange Zeilen rechts auslaufen. Mit --no-full kürzt du die Anzeige:
journalctl --no-fullbashMit -a wird hingegen der gesamte Inhalt angezeigt:
journalctl -abashjournalctl auf Standardausgabe setzen
Normalerweise wird ein Pager wie less genutzt. Möchtest du die Logs direkt in der Konsole (Standardausgabe) ausgeben, nutze:
journalctl --no-pagerbashAusgabeformate einstellen
Mit -o und einem Formatbezeichner änderst du den Stil. Für JSON-Ausgabe nutzt du:
journalctl -b -u nginx -o json
{ "__CURSOR" : "s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : "6", "_UID" : "0", "_GID" : "0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : "752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : "3", "CODE_FILE" : "src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" :bashVerfügbare Formate sind unter anderem:
- cat: Nur das Meldungsfeld.
- export: Binärformat für Backups.
- json: Ein JSON-Eintrag pro Zeile.
- json-pretty: Formatiertes JSON für bessere Lesbarkeit.
- short: Klassischer syslog-Stil.
- verbose: Zeigt alle verfügbaren Felder eines Eintrags.
Aktive Prozessüberwachung
Mit der Option -n (ähnlich wie beim Befehl tail -n) verfolgst du Prozesse aktiv und lässt dir nur die neuesten Einträge anzeigen.
Anzeigen aktueller Protokolle
Standardmäßig siehst du mit diesem Befehl die letzten 10 Einträge:
journalctl -nbashDie Anzahl kannst du individuell anpassen, zum Beispiel auf 20:
journalctl -n 20bash