journalctl
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 24.04 Noble Numbat
Ubuntu 22.04 Jammy Jellyfish
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:
systemd verwendet standardmäßig ein zentrales Protokoll bzw. Journal, in das von journald alle Logmeldungen geschrieben werden. Zur Abfrage des Journals dient der Kommandozeilen-Befehl journalctl.
Installation¶
Da systemd ab Ubuntu 15.04 integraler Bestandteil des Systems ist (und dieses ohne systemd nicht lauffähig ist), sind alle benötigten Komponenten bereits installiert.
Benutzung¶
Die allgemeine Syntax von journalctl lautet[1]:
journalctl [OPTIONEN]
Sind mehrere Journal-Dateien vorhanden, führt journalctl diese für die Ausgabe automatisch zusammen.
Hinweis:
Um alle Einträge des Journals zu sehen, muss der aufrufende Nutzer Mitglied der Gruppe adm
oder systemd-journal
sein. Ansonsten sieht man lediglich Einträge, die den eigenen Nutzer betreffen, aber keine Einträge des Systems und anderer Nutzer.
Ruft man journalctl ohne Optionen auf, so sieht man alle Einträge im Journal, die zur Zeit vom System gespeichert sind.
Bei der Anzeige wird standardmäßig der Pager less verwendet, d.h. die Ausgabe hält automatisch an, wenn die maximale Zeilenanzahl des Bildschirms erreicht ist:
Mit der Leertaste blättert man eine Seite weiter,
mit ↑ oder ↓ zeilenweise zurück oder vor.
Möchte man journalctl beenden, so drückt man einfach Strg + C .
Alle weiteren Möglichkeiten (z.B. Suche, zurück blättern) von less sind natürlich ebenfalls möglich.
Außerdem wird die Ausgabe eingefärbt. So sind Logeinträge der Priorität "Error" rot, die der Priorität "Warning" und "Notice" weiß und die der niedrigen Prioritäten wie "Info" und "Debug" grau.
Wenn man einen anderen Pager oder auch gar keinen verwenden möchte, hat man mehrere Möglichkeiten:
Man filtert selbst, z.B.:
journalctl [OPTIONEN] | cat
journalctl [OPTIONEN] | grep SUCHMUSTER
Man verwendet die Option
--no-pager
.Man setzt die Umgebungsvariable
SYSTEMD_PAGER
:SYSTEMD_PAGER=more journalctl [OPTIONEN]
Jede Zeile im Log hat einen Aufbau wie im Folgenden gezeigt:
Jan 16 21:28:38 RECHNERNAME NetworkManager[706]: <info> monitoring kernel firmware directory '/lib/firmware'.
Zum Beginn der Zeile stehen Datum und Uhrzeit, gefolgt vom Rechnernamen, dem "Identifier", dem Loglevel und der Logmeldung an sich.
journalctl kennt eine Vielzahl von Optionen, um die angezeigten Logmeldungen zu filtern:
Optionen von journalctl | |
Option | Erklärung |
-e , --pager-end | Springt direkt ans Ende des Journals, d.h. die neuesten Einträge werden angezeigt. |
-r , --reverse | Sortiert die Logeinträge in umgekehrter Reihenfolge, d.h. die neuesten werden zuerst angezeigt. |
-f , --follow | Springt direkt ans Ende des Journals und zeigt neue Einträge "live" an. Der Follow-Modus kann mit Strg + C verlassen werden. |
-b , --boot | Zeigt alle Logeinträge seit dem letzten Booten an. |
--since=DATUM | Zeigt alle Logeinträge ab dem Datum DATUM an. Datum hat folgendes Format "JJJJ-MM-TT HH:MM:SS" , also z.B. "2016-01-17 12:00:00" . |
--since=yesterday | Zeigt alle Logeinträge ab 00:00:00 Uhr des Vortages an. |
--until=DATUM | Wie --since DATUM , nur dass Logeinträge bis zum Datum DATUM angezeigt werden. |
-k , --dmesg | Zeigt nur Logmeldungen des Kernels an. |
-u UNITNAME , --unit UNITNAME | Zeigt nur Logmeldungen der Unit UNITNAME an. Es kann ein kompletter Unitname oder ein Muster angegeben werden. So würde z.B. journalctl -u an* nur Logeinträge von Units anzeigen, deren Name mit an beginnt. |
-t IDENTIFIER , --identifier IDENTIFIER | Zeigt nur Logeinträge an, die den Identifier IDENTIFIER zugeordnet sind. |
-p PRIORITÄT , --priority PRIORITÄT | Zeigt Logeinträge bis zur Priorität PRIORITÄT an. Mögliche Werte sind: emerg , alert , crit , err , warning , notice , info und debug . Alternativ können die Prioritäten als Zahl angegeben werden. 0 entspricht emerg , 1 entspricht alert usw. |
-o verbose | Zeigt zu jedem Logeintrag alle verfügbaren Metadaten an. Dadurch wird die Ausgabe sehr detailliert - und sehr lang. |
journalctl kennt noch eine ganze Reihe weitere Optionen. Eine vollständige Übersicht mit Erklärung über alle Optionen liefert der Aufruf von journalctl -h
oder die Dokumentation 🇬🇧.
Ältere Logs abfragen¶
Standardmäßig ist unter Ubuntu das dauerhafte speichern des Journal aktiviert. Man sich mit journalctl auch gezielt ältere Journaldateien anzeigen lassen. Dazu dient die Option -b BOOTNUMMER
bzw. --boot=BOOTNUMMER
. Der neuste (=der aktuelle) Systemstart hat dabei die Nummer 0
(null), der vorherige die Nummer -1
usw.
Alle ältere Journaldateien lassen sich über den Befehl:
journalctl --list-boots
anzeigen.
Logs benutzerabhängig abfragen¶
Gibt es zusätzlich zur Journal-Datei des Systems zusätzlich eine Journal-Datei pro Benutzer, kann man die Einträge der eigenen Logdatei über die Option --user
abrufen.
Beispiele¶
Gefiltert nach Priorität¶
Verwendung der Option -p.
Alle Meldungen mit Kennzeichnung error, critical, alert oder emergency anzeigen:
journalctl -p err -b
Gefiltert nach Unit¶
Verwendung der Option -u.
Es ist erlaubt mehrere Units gleichzeitig anzugeben:
journalctl -u home.mount -u networking.service
Um eine Unit live zu verfolgen:
journalctl -f -u apache
Gefiltert nach Datum¶
Verwendung der Optionen --since und --until.
Dabei ist die Verwendung absoluter Zeiten im YYYY-MM-DD HH:MM:SS-Format erlaubt, als auch Wörter wie yesterday, 1 hour ago etc. Eine Übersicht findet sich in der Manpage von systemd.time. Der --until-Parameter ist optional.
journalctl --since "2023-07-01" --until "2 minutes ago"
Problembehebung¶
Logmeldungen mit einem Live-/Rettungssystem auslesen¶
Falls im fraglichen (z.B. defekten) System die persistente Speicherung für das Journal aktiviert war , können die Logs von außen mit einem Live- oder Rettungssystem mit strings und egrep ausgelesen werden. Alternativ kann man journalctl der Option -D
oder --directory=
den Pfad zur Journaldatei angeben. Wenn man z.B. die Festplatte eines defekten Systems unter /mnt/hd1/ eingebunden hat und dort die Logdatei an normaler Stelle liegt, sollte man dieses mit
journalctl -D /mnt/hd1/var/log/journal/UUID_DES_VERZEICHNISSES/
betrachten können.
Logdaten belegen zu viel Speicherplatz¶
Wenn sich zu viele Logdaten ansammeln und die /-Partition "vollläuft", droht die Gefahr, dass das System dann nicht mehr startet.
Den von den Journalen belegten Speicherplatz zeigt dieser Befehl an:
journalctl --disk-usage
Beispielhafte Ausgabe:
Archived and active journals take up 168.0M in the file system.
Man kann dann den aktuell belegten Speicherplatz teilweise durch Löschen von Journale wieder freigeben, das ist nach Zeit oder Größe steuerbar:
Der Befehl
sudo journalctl --vacuum-time 90d
löscht alles, was mehr als die angegebene Dauer (im Beispiel 90 Tage) zurück liegt.
Der Befehl
sudo journalctl --vacuum-size 100M
löscht, angefangen von den ältesten Einträgen, alles bis nur noch die angegebenen Menge (im Beispiel 100MB) an Journalen verbleibt.
Die beiden Angaben darf man auch kombinieren und es sind auch die üblichen anderen Maßeinheiten verwendbar.
Für eine dauerhafte Größenbegrenzung siehe systemd/journald (Abschnitt „Konfiguration“).
Links¶
Dokumentation 🇬🇧 des systemd-Journals
Erklärung 🇬🇧, welche Metadaten im systemd-Journal mit gespeichert werden