Mit Jour­nalctl lassen sich unter Linux Sys­tem­pro­to­kol­le effizient verwalten und ana­ly­sie­ren. Das Tool bietet Funk­tio­nen zur Über­wa­chung von Sys­tem­ak­ti­vi­tä­ten, Feh­ler­su­che, Echt­zeit­pro­to­koll­ver­fol­gung, de­tail­lier­ten Einblick in die Pro­to­koll­da­ten und ist un­ver­zicht­bar, wenn es darum geht, Sys­tem­pro­ble­me effektiv zu dia­gnos­ti­zie­ren.

Was ist Jour­nalctl?

Jour­nalctl ist ein leis­tungs­fä­hi­ges Dienst­pro­gramm zum Abfragen und Anzeigen von Er­eig­nis­pro­to­kol­len bzw. Logfiles unter Linux. Es ist ein zentraler Be­stand­teil der System- und Dienst­ver­wal­tungs-Suite systemd, die in vielen modernen Linux-Dis­tri­bu­tio­nen wie Ubuntu, Fedora und Arch Linux stan­dard­mä­ßig verwendet wird. Der Name „jour­nalctl“ setzt sich aus den Begriffen „journal“ (Protokoll) und „ctl“ (Control) zusammen, was auf seine Funktion als Tool zur Kontrolle und Analyse von Pro­to­kol­len hinweist.

Jour­nalctl er­mög­licht den Zugriff auf das Sys­tem­pro­to­koll, das von systemd-journald verwaltet wird. Das Sys­tem­pro­to­koll ist eine zentrale Sammlung von Meldungen und Er­eig­nis­sen, die während des Betriebs des Linux-Systems auftreten. Im Gegensatz zu her­kömm­li­chen text­ba­sier­ten Pro­to­kol­len bietet Jour­nalctl eine struk­tu­rier­te und ef­fi­zi­en­te Mög­lich­keit, Pro­to­koll­da­ten in Echtzeit zu durch­su­chen, zu filtern und an­zu­zei­gen. Dies kann dabei helfen, Probleme zu dia­gnos­ti­zie­ren oder den Sys­tem­sta­tus zu über­wa­chen.

Dazu speichert Jour­nalctl die Pro­to­koll­da­tei­en im Bi­när­for­mat, denn binäre Pro­to­koll­da­tei­en sind kompakter und ef­fi­zi­en­ter als ihre text­ba­sier­ten Äqui­va­len­te. Dies er­mög­licht an­ge­sichts der großen Menge an pro­to­kol­lier­ten Daten eine schnel­le­re und ef­fi­zi­en­te­re Suche nach be­stimm­ten Er­eig­nis­sen oder In­for­ma­tio­nen innerhalb der Pro­to­koll­da­tei­en. Zu­sätz­lich bieten binäre Pro­to­koll­da­tei­en, aufgrund ihrer Struktur und Ver­schlüs­se­lung, eine höhere Si­cher­heit gegenüber text­ba­sier­ten Pro­to­kol­len, da binäre Formate die Ma­ni­pu­la­ti­on von Pro­to­koll­da­ten er­schwe­ren.

Spei­cher­platz für Pro­to­koll­da­tei­en anpassen

Mit Jour­nalctl lässt sich der Spei­cher­platz, den die Pro­to­koll­da­tei­en auf der Fest­plat­te belegen, begrenzen und kon­fi­gu­rie­ren. Dies geschieht über die Ein­stel­lun­gen des systemd-journald-Dienstes. Die Kon­fi­gu­ra­ti­ons­ein­stel­lun­gen sind in der Datei /etc/systemd/journald.conf ge­spei­chert. Darin finden Sie folgende Einträge:

  • SystemMaxUse: Begrenzt den Spei­cher­platz für Pro­to­kol­le im Sys­tem­ver­zeich­nis.
  • RuntimeMaxUse: Begrenzt den Spei­cher­platz für Pro­to­kol­le im tem­po­rä­ren Ver­zeich­nis.

Zum Ein­stel­len der Spei­cher­platz­be­gren­zung fügen Sie die folgenden Zeilen hinzu oder ändern diese je nach Bedarf:

[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50M
bash

Die Werte aus diesem Beispiel (50M) lassen sich beliebig ändern. Dabei können Sie auch ver­schie­de­ne Einheiten wie K (Kilobytes), M (Megabytes), G (Gigabytes) oder T (Ter­ra­bytes) verwenden. Nachdem Sie die Kon­fi­gu­ra­ti­ons­da­tei be­ar­bei­tet haben, muss systemd-journald neu gestartet werden, damit die Än­de­run­gen wirksam werden:

sudo systemctl restart systemd-journald
bash

Nach diesen Schritten ist systemd-journald so kon­fi­gu­riert, dass der Spei­cher­platz für Pro­to­koll­da­tei­en begrenzt ist. Stellen Sie sicher, dass die gewählte Be­gren­zung aus­rei­chend ist, um wichtige Pro­to­koll­da­ten zu speichern, aber nicht zu viel Fest­plat­ten­spei­cher ver­braucht. Beachten Sie, dass ältere Pro­to­kol­le au­to­ma­tisch gelöscht werden, wenn das Limit erreicht ist.

Ermitteln der Fest­plat­ten­be­le­gung

Bevor Sie den Spei­cher­platz für Pro­to­koll­da­tei­en anpassen, können Sie zunächst prüfen, wie viel Spei­cher­platz aktuell durch Journal belegt wird. Dies ist mit dem Flag --disk-usage möglich:

journalctl --disk-usage
Journals take up 8.0M on disk.
bash

Alte Pro­to­koll­ein­trä­ge löschen

Nimmt Journal zu viel Spei­cher­platz ein, lassen sich alte Pro­to­koll­ein­trä­ge einfach wieder löschen. Dazu stehen zwei Mög­lich­kei­ten zur Verfügung:

Mit --vacuum-size lässt sich Ihr Journal durch Angabe einer Größe ver­klei­nern. In diesem Fall werden alte Einträge entfernt, bis der gesamte auf der Fest­plat­te belegte Journal-Spei­cher­platz die ge­wünsch­te Größe erreicht hat.

sudo journalctl --vacuum-size=1G
bash

Al­ter­na­tiv lässt sich Journal durch die Angabe einer Sperrzeit mit der Option --vacuum-time ver­klei­nern. Dabei werden alle Einträge, die über die an­ge­ge­be­ne Zeit hin­aus­ge­hen, gelöscht. Falls Sie z. B. Pro­to­koll­ein­trä­ge aus dem letzten Jahr behalten wollen, können Sie Folgendes eingeben:

sudo journalctl --vacuum-time=1years
bash

Was kann Jour­nalctl?

Eine der leis­tungs­star­ken Funk­tio­nen von Jour­nalctl ist die Mög­lich­keit, Log-Einträge nach ver­schie­de­nen Kriterien zu filtern. Diese Funktion er­mög­licht es, gezielt nach re­le­van­ten In­for­ma­tio­nen zu suchen und so Probleme schneller zu iden­ti­fi­zie­ren. Im Folgenden stellen wir Ihnen einige der ge­bräuch­lichs­ten Fil­ter­op­tio­nen von Jour­nalctl vor.

Pro­to­kol­le anzeigen

Durch Eingabe des Befehls journalctl werden die Pro­to­koll­ein­trä­ge für das aktuelle System in um­ge­kehr­ter chro­no­lo­gi­scher Rei­hen­fol­ge angezeigt. Geben Sie journalctl -f oder journalctl --follow ein, um sich die Einträge in Echtzeit anzeigen zu lassen. Neue Einträge werden au­to­ma­tisch in der Rei­hen­fol­ge ihres Ein­tref­fens angezeigt.

Je nachdem, wie lange systemd bereits auf Ihrem System läuft, wird Ihnen wahr­schein­lich eine un­über­schau­ba­re Menge an Daten angezeigt werden, die zehn- oder hun­dert­tau­sen­de Zeilen lang sein können. Um schneller zu finden, was Sie suchen, lassen sich die Pro­to­kol­le mit ver­schie­de­nen Linux-Befehlen weiter filtern.

Filtern nach Zeit

Mit Jour­nalctl lassen sich Pro­to­kol­le nach einem be­stimm­ten Zeitpunkt filtern, um diese ef­fi­zi­en­ter nach re­le­van­ten In­for­ma­tio­nen durch­su­chen zu können.

Filtern nach Boot­vor­gän­gen

Das Filtern von Pro­to­kol­len nach Boot­vor­gän­gen ist besonders nützlich, um bestimmte Sys­tem­er­eig­nis­se zu einem be­stimm­ten Zeitpunkt oder während eines be­stimm­ten Boot­sze­na­ri­os zu über­prü­fen. Dies er­leich­tert die Diagnose von Problemen, da sich die Pro­to­koll­ein­trä­ge dadurch auf einen be­stimm­ten Sys­tem­zu­stand oder eine bestimmte Kon­fi­gu­ra­ti­on ein­gren­zen können.

  1. Aktueller Boot: Mit journalctl -b werden alle Pro­to­koll­ein­trä­ge angezeigt, die seit dem letzten Neustart gesammelt wurden.
  2. Ver­gan­ge­ne Boot­vor­gän­ge: Mit der Option -b, gefolgt von einer Zahl, können Sie sich die Pro­to­koll­ein­trä­ge für einen be­stimm­ten vor­he­ri­gen Boot­vor­gang anzeigen lassen. Wenn Sie z. B. journalctl -b 1 eingeben, wird der vorherige Boot­vor­gang angezeigt.
  3. Liste aller ver­füg­ba­ren Boot­vor­gän­ge: Der Befehl journalctl --list-boots zeigt eine Liste der ver­füg­ba­ren Boot­vor­gän­gen mit ihren je­wei­li­gen IDs an. Sie können die ge­wünsch­te Boot-ID verwenden, um die Pro­to­kol­le für einen be­stimm­ten Boot­vor­gang an­zu­zei­gen.

Während bei einigen Linux-Dis­tri­bu­tio­nen das Speichern von ver­gan­ge­nen Boot­vor­gän­ge stan­dard­mä­ßig aktiviert ist, muss diese Funk­tio­nen bei anderen erst aktiviert werden. Dazu können Sie ein Ver­zeich­nis erstellen, in dem das Protokoll ge­spei­chert werden soll, indem Sie sudo mkdir -p /var/log/journal eingeben.

Al­ter­na­tiv können Sie dazu die Journal-Kon­fi­gu­ra­ti­ons­da­tei mit sudo nano /etc/systemd/journald.conf be­ar­bei­ten. Danach setzen Sie unter [Journal] die Option Storage= auf persistent, um die per­sis­ten­te Pro­to­kol­lie­rung zu ak­ti­vie­ren:

. . .
[Journal]
Storage=persistent
bash

Filtern nach Zeit­fens­tern

Manchmal kann es notwendig sein, Pro­to­koll­ein­trä­ge für einen be­stimm­ten Zeitraum an­zu­zei­gen. Jour­nalctl bietet dazu die Optionen --since und --until, mit denen sich die Einträge auf einen be­stimm­ten Zeitraum ein­schrän­ken lassen. Nutzen Sie dazu das Zeit­for­mat YYYY-MM-DD HH:MM:SS. Der Befehl, um sich z. B. alle Pro­to­koll­ein­trä­ge zwischen dem 1. Januar 2023 um 12:00 Uhr und dem 2. Januar 2023 um 12:00 Uhr anzeigen zu lassen, sieht dem­entspre­chend wie folgt aus:

journalctl --since "2023-01-01 12:00:00" --until "2023-01-02 12:00:00"
bash

Die Kom­bi­na­ti­on der beiden Befehle kann auch einen kürzeren Zeitpunkt filtern:

journalctl --since 09:00 --until "1 hour ago"
bash

Al­ter­na­tiv besteht die Mög­lich­keit, Teile des obigen Formats weg­zu­las­sen. So lassen sich z. B. alle Einträge ab einem be­stimm­ten Zeitpunkt anzeigen:

journalctl --since "2023-11-16 15:25:00"
bash

Jour­nalctl versteht auch relative Werte wie z. B. die Wörter yesterday (gestern), today (heute) oder tomorrow (morgen). Um Einträge von gestern an­zu­zei­gen, geben Sie Folgendes ein:

journalctl --since yesterday
bash

Filtern nach Nach­rich­ten­in­ter­es­se

Das Filtern von Pro­to­koll­ein­trä­gen nach Nach­rich­ten­in­ter­es­se mit Jour­nalctl ist ebenfalls äußerst nützlich, da es die gezielte Suche nach re­le­van­ten In­for­ma­tio­nen und die Kon­zen­tra­ti­on auf bestimmte Aspekte der Sys­tem­pro­to­kol­le er­mög­licht. Dadurch lassen sich unter anderem eine ef­fi­zi­en­te Feh­ler­dia­gno­se, eine Früh­erken­nung von Si­cher­heits­pro­ble­men und eine schnelle Leis­tungs­über­wa­chung durch­füh­ren.

Filtern nach Priorität

Um die Pro­to­kol­le mit Jour­nalctl nach be­stimm­ten Nach­rich­ten­in­ter­es­sen zu filtern, können Sie die Prio­ri­tä­ten der Pro­to­koll­ein­trä­ge nutzen. Dazu können Sie den Namen der je­wei­li­gen Priorität oder deren ent­spre­chen­den nu­me­ri­schen Wert verwenden. Je niedriger die Nummer, desto wichtiger ist die Meldung:

  • 0: emerg (Notfall)
  • 1: alert (Alarm)
  • 2: crit (kritisch)
  • 3: err (Fehler)
  • 4: warning (Warnung)
  • 5: notice (Hinweis)
  • 6: info (In­for­ma­ti­on)
  • 7: debug (Feh­ler­su­che)

Meldungen mit einer be­stimm­ten Priorität lassen sich mit der Option -p filtern. Durch folgenden Befehl werden bei­spiels­wei­se nur Pro­to­koll­ein­trä­ge mit der Priorität „err“ (Error) und höher angezeigt:

journalctl -p err
bash

Filtern nach Einheit

Das Filtern von Pro­to­kol­len nach Einheiten mit Jour­nalctl ist besonders nützlich, wenn Sie sich auf spe­zi­fi­sche Dienste oder Prozesse kon­zen­trie­ren wollen. Diese lassen sich mit der Option -u filtern. Um sich z. B. die Pro­to­koll­ein­trä­ge für den Apache-Webserver anzeigen zu lassen, können Sie Folgendes eingeben:

journalctl -u apache2
bash

Die Suche lässt sich mit den bereits bekannten relativen Zeit­wer­ten weiter ver­fei­nern. Falls Sie wissen wollen, ob der Dienst heute bereits aus­ge­führt wurde, können Sie Folgendes eingeben:

journalctl -u apache2 --since today
bash

Mit Jour­nalctl lassen sich auch Da­ten­sät­ze aus ver­schie­de­nen Einheiten zu­sam­men­füh­ren. Ist Ihr Nginx-Prozess z. B. mit einer PHP-FPM-Einheit verbunden, lassen sich die Einträge von beiden in chro­no­lo­gi­scher Rei­hen­fol­ge zu­sam­men­füh­ren. Der Befehl dazu lautet:

journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since today
bash

Filtern nach Prozess, Benutzer oder Gruppen-ID

Mit Jour­nalctl lassen sich Pro­to­koll­ein­trä­ge auch nach Prozess, Benutzer oder Gruppen-ID filtern. Sofern Sie die genaue PID des Prozesses kennen, nach dem Sie suchen wollen, lässt sich dieser mit der Option_PID filtern. Ist die PID z. B. 8088, lautet der Befehl:

journalctl _PID=8088
bash

Al­ter­na­tiv können Sie sich mit den Filtern _UID oder _GID alle Einträge anzeigen lassen, die von einem be­stimm­ten Benutzer oder einer Gruppe pro­to­kol­liert wurden. Hat Ihr Webserver z. B. den Namen „www-data“, lässt sich die Benutzer-ID wie folgt finden:

id -u www-data
33
bash

Mit der nun bekannten ID können die Jour­nal­ein­trä­ge gefiltert werden:

journalctl _UID=33 --since today
bash

Um zu sehen, für welche Gruppen-IDs Einträge an­ge­fer­tigt wurden, können Sie die Option -F verwenden. Diese zeigt Ihnen alle Werte, die für das Feld „Gruppen-ID“ ge­spei­chert sind:

journalctl -F _GID
32
99
102
133
81
84
100
0
124
87
bash

Filtern nach Kom­po­nen­ten­feld

Die Filterung nach dem Kom­po­nen­ten­feld ist äußerst nützlich, um den Fokus auf spe­zi­fi­sche An­wen­dun­gen, Dienste oder Prozesse zu lenken. Das Kom­po­nen­ten­feld wird nor­ma­ler­wei­se von ver­schie­de­nen Diensten oder Software-Kom­po­nen­ten genutzt, um spe­zi­fi­sche In­for­ma­tio­nen in den Pro­to­kol­len zu iden­ti­fi­zie­ren. Durch diese Art der Filterung lassen sich die Pro­to­koll­ein­trä­ge gezielt auf eine bestimmte Kom­po­nen­te, Anwendung oder Ser­vice­ein­heit ein­gren­zen. Um z. B. die Einträge, die die aus­führ­ba­re Datei bash enthalten, zu filtern, müssen Sie folgenden Befehl eingeben:

journalctl /usr/bin/bash
bash

Kernel-Meldungen anzeigen

Das Filtern von Pro­to­koll­ein­trä­gen nach Kernel-Meldungen mit Jour­nalctl ist eine effektive Methode, um spe­zi­fi­sche In­for­ma­tio­nen über den Kernel-Betrieb in einem Linux-System zu ana­ly­sie­ren. Ker­nel­mel­dun­gen können Hinweise auf Hardware-Probleme, Trei­ber­kon­flik­te oder andere Sys­tem­er­eig­nis­se liefern.

Kernel-Meldungen, die in der Ausgabe dmesg zu finden sind, können ebenfalls aus dem Journal gefiltert werden. Sie lassen sich mit den Flags -k oder–dmesg ` anzeigen:

journalctl -k
bash

Dabei werden stan­dard­mä­ßig die Kernel-Meldungen des aktuellen Boot­vor­gangs angezeigt. Die Meldungen eines al­ter­na­ti­ven Boot­vor­gangs können mit den bereits bekannten Boot-Auswahl-Flags gefiltert werden. Wenn Sie z. B. die Kernel-Meldungen der letzten fünf Boot­vor­gän­ge sehen wollen, geben Sie Folgendes ein:

journalctl -k -b -5
bash

Ändern der Journ­al­an­zei­ge in Jour­nalctl

Die Anpassung der Anzeige in Jour­nalctl er­mög­licht es Benutzern, Pro­to­kol­le gezielter zu durch­su­chen und relevante In­for­ma­tio­nen schneller zu ex­tra­hie­ren. So können durch die gezielte Anzeige von Pro­to­koll­da­ten über einen be­stimm­ten Zeitraum oder in Echtzeit z. B. Fehler und Probleme im System schnell erkannt werden.

Kürzen oder Erweitern der Ausgabe

Sie können in­di­vi­du­ell anpassen, wie Jour­nalctl Daten anzeigt. Dazu lässt sich die Ausgabe entweder verkürzen oder erweitern. Jour­nalctl zeigt den gesamten Eintrag stan­dard­mä­ßig im Pager an und lässt die Einträge rechts am Bild­schirm auslaufen. Die Ausgabe lässt sich mit der Option --no-full kürzen:

journalctl --no-full
bash

Erweitern können Sie die Anzeige dagegen dem Flag -a:

journalctl -a
bash

Jour­nalctl auf Stan­dard­aus­ga­be setzen

In Jour­nalctl wird die Pro­to­koll­aus­ga­be stan­dard­mä­ßig durch einen Pager, z. B. less, angezeigt. Das hat den Vorteil, dass die Ausgabe Schritt für Schritt be­trach­tet werden kann und es einfacher ist, durch lange Pro­to­koll­da­tei­en zu na­vi­gie­ren. Manchmal kann es jedoch notwendig sein, die Pro­to­kol­le direkt auf der Stan­dard­aus­ga­be an­zu­zei­gen. Das ist wie folgt möglich:

journalctl --no-pager
bash

Aus­ga­be­for­ma­te ein­stel­len

Wenn nötig, gibt es ver­schie­de­ne Optionen, um das Aus­ga­be­for­mat der Pro­to­kol­le in Jour­nalctl an­zu­pas­sen. Dazu kann die Option -o mit dem je­wei­li­gen For­mat­be­zeich­ner verwendet werden. So lassen sich die Pro­to­koll­ein­trä­ge z. B. in JSON ausgeben:

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" :
bash

Folgende Formate können in Jour­nalctl verwendet werden:

  • cat: Zeigt nur das Mel­dungs­feld an.
  • export: Dieses Bi­när­for­mat eignet sich zum Über­tra­gen oder Sichern.
  • json: Standard-JSON mit einem Eintrag pro Zeile.
  • json-pretty: Für eine bessere Les­bar­keit for­ma­tier­tes JSON.
  • json-sse: Ein­ge­hüll­te JSON-for­ma­tier­te Ausgabe, die das Hin­zu­fü­gen von vom Server ge­sen­de­ten Er­eig­nis­sen er­mög­licht.
  • short: Stan­dard­aus­ga­be im syslog-Stil.
  • short-iso: Stan­dard­for­mat zum Anzeigen von ISO-8601 Wallclock-Zeit­stem­peln.
  • short-monotonic: Stan­dard­for­mat mit monotonen Zeit­stem­peln.
  • short-precise: Stan­dard­for­mat mit Mi­kro­se­kun­den­ge­nau­ig­keit.
  • verbose: Zeigt jedes für den je­wei­li­gen Eintrag ver­füg­ba­re Jour­nal­feld an.

Aktive Pro­zess­über­wa­chung

In der aktiven Pro­zess­über­wa­chung mit Jour­nalctl wird das Be­fehls­zei­len­pro­gramm tail verwendet, um Pro­to­kol­le in Echtzeit zu verfolgen und nur die letzten Einträge an­zu­zei­gen. Dies er­leich­tert die Echt­zeit­über­wa­chung von Sys­tem­er­eig­nis­sen und die schnelle Reaktion auf auf­tre­ten­de Probleme.

Anzeigen aktueller Pro­to­kol­le

Die Option -n kann verwendet werden, um eine bestimmte Anzahl von Da­ten­sät­zen an­zu­zei­gen. Dabei funk­tio­niert die Option genau wie tail -n. Mit folgendem Befehl werden stan­dard­mä­ßig die letzten 10 Einträge angezeigt:

journalctl -n
bash

Die Anzahl der Einträge, die Ihnen angezeigt werden, kann dabei in­di­vi­du­ell ein­ge­stellt werden, z. B. auf 20:

journalctl -n 20
bash
Zum Hauptmenü