Zum Inhalt springen

journalctl

Aus Foxwiki

journalctl - Abfragen des Systemd-Journals

Beschreibung

journalctl dient der Abfrage von Inhalten des Journals von systemd
  • wie von systemd-journald.service(8) geschrieben
systemd bringt ein eigenes Logging-Framework namens journald mit
  • Dass die Log-Dateien binär gespeichert werden, um sie länger und fälschungssicher – so zumindest der Anspruch der systemd-Entwickler – speichern zu können, ist jedoch ein großer Kritikpunkt der Linux-Community
  • Allerdings hat journald Charme und bringt außer der Umgewöhnung auch einige Vorteile mit, wie beispielsweise, dass Fehler in den Log-Dateien in Rot markiert werden und so eher auffallen

Installation

Aufruf

Optionen

Unix GNU Parameter Beschreibung

Parameter

Umgebungsvariablen

Exit-Status

Wert Beschreibung
0 Erfolg
>0 Fehler

Anwendung

Rufen Sie beispielsweise journalctl ohne weitere Parameter auf, bekommen Sie einen interaktiven Auszug aller Log-Dateien, so wie sie früher in /var/log/syslog oder /var/log/messages landeten

  • Hier können Sie auch durch Eingabe eines großen »F« in den Follow-Modus wechseln
  • Mit dem Parameter -f oder --follow wird Ihnen das Log analog zu einem tail -f angezeigt
  • Wenn Sie die letzten 20 Log-Einträge anschauen wollen, benutzen Sie -n 20 oder --lines=20
  • Der Parameter --reverse zeigt die Einträge in umgekehrter Reihenfolge an

Einträge eines bestimmten Zeitraums grenzen Sie durch --since und --until ein

  • Dabei wird ein Datum in der Form "2018-07-30 18:17:16" ausgewertet
  • Ohne Datum wird der heutige Tag angenommen, ohne Sekunden wird 0 (null) angenommen, Sonderausdrücke wie yesterday, today, tomorrow oder now sind möglich

Einer der wichtigsten Parameter ist -u oder --unit=, womit nur die Log-Dateien einer einzelnen Unit oder eines Satzes an Units ausgegeben werden

Log-Auszug des SSH-Daemons

Log-Einträge des SSH-Daemons vom 5. Juni 2023 zwischen 13:00 Uhr und 14:00 Uhr

sudo journalctl --since="2023-06-05 13:00" --until="2023-06-05 14:00" --unit=sshd.service
-- Logs begin at Mo 2023-06-05 07:19:24 CEST, end at Mo 2023-06-05 15:56:51 CEST. --
Jun 05 13:07:24 centos sshd[13128]: reverse mapping checking getaddrinfo for \
1-2-3-4.a.b [1.2.3.4] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 05 13:07:24 centos sshd[13130]: reverse mapping checking getaddrinfo for \
1-2-3-4.a.b [1.2.3.4] failed - POSSIBLE BREAK-IN ATTEMPT!
Jun 05 13:07:24 centos sshd[13128]: Connection closed by 1.2.3.4 [preauth]
Jun 05 13:07:24 centos sshd[13130]: Connection closed by 1.2.3.4 [preauth]

Die Logs von journald werden nach einem Neustart gelöscht

  • Wenn Sie das nicht wollen, sollten Sie das Verzeichnis /var/log/journal anlegen und das Signal SIGUSR1 an den journald-Prozess senden
  • Damit werden die Logs in dem angegebenen Verzeichnis persistiert, sodass sie maximal zehn Prozent der Größe des Dateisystems belegen
  • Weitere Konfigurationen nehmen Sie in der Datei /etc/systemd/journald.conf vor

Abfragen des systemd-Journals

Mit dem Wechsel von herkömmlichen init-Skripten zu systemd wurde ein eigenes Protokolliersystem eingeführt, das als Journal bezeichnet wird

  • Alle Systemereignisse werden in das Journal geschrieben, so dass kein syslog-basierter Service ausgeführt werden muss

Das Journal selbst ist ein Systemservice und wird mit systemd verwaltet

  • Die vollständige Bezeichnung des Service lautet systemd-journald.service
  • Hier werden Protokolldaten in strukturierten, indizierten Journalen erfasst und gespeichert
  • Die Daten basieren dabei auf den Protokollinformationen aus dem Kernel, von den Benutzerprozessen, aus der Standardeingabe und aus den Fehlern von Systemdiensten
  • Der Dienst systemd-journald ist standardmäßig aktiviert
# systemctl status systemd-journald</nowiki> systemd-journald.service - Journal Service
Loaded: loaded (/usr/lib/systemd/system/systemd-journald.service; static)
Active: active (running) since Mon 2014-05-26 08:36:59 EDT; 3 days ago
 Docs: man:systemd-journald.service(8)
  man:journald.conf(5)
Main PID: 413 (systemd-journal)
Status: "Processing requests..."
CGroup: /system.slice/systemd-journald.service
  └─413 /usr/lib/systemd/systemd-journald
[...]

Nützliche Schalter in journalctl

In diesem Abschnitt finden Sie einige häufig verwendete, nützliche Optionen, mit denen Sie das Standardverhalten von journalctl optimieren

  • Alle Schalter sind auf der man-Seite zu journalctl (man 1 journalctl) beschrieben

Tipp: Meldungen für eine bestimmte ausführbare Datei

Sollen alle Journaleinträge für eine bestimmte ausführbare Datei angezeigt werden, geben Sie den vollständigen Pfad zu dieser Datei an

journalctl /usr/lib/systemd/systemd

-f Zeigt lediglich die jüngsten Protokollmeldungen an und gibt neue Protokolleinträge aus, sobald sie zum Journal hinzugefügt werden

-e Gibt die Meldungen aus und springt an das Ende des Journals, so dass im Pager die aktuellen Einträge sichtbar sind

-r Gibt die Meldungen des Journals in umgekehrter Reihenfolge aus (die jüngsten Einträge zuerst)

-k Zeigt nur Kernel-Meldungen an

-u Zeigt nur Meldungen für die angegebene systemd-Einheit an

# journalctl -u apache2
[...] Jun 03 10:07:11 pinkiepie systemd[1]: Starting The Apache Webserver.
Jun 03 10:07:12 pinkiepie systemd[1]: Started The Apache Webserver

Filtern der Journalausgabe

Wenn Sie journalctl ohne Schalter aufrufen, wird der gesamte Inhalt des Journals angezeigt (die ältesten Einträge an erster Stelle)

  • Die Ausgabe kann mit bestimmten Schaltern und Feldern gefiltert werden

Filtern nach Bootnummer

journalctl kann die Meldungen nach einem bestimmten System-Bootvorgang filtern

  • Zum Anzeigen einer Liste mit allen verfügbaren Bootvorgängen führen Sie Folgendes aus
journalctl --list-boots -1 
0 97ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
1 56019a44a774a0bb0148a92df4af81b Fri 2014-05-30 05:34:09 EDT—Fri 2014-05-30 06:15:01 EDT
  • Die erste Spalte enthält den Boot-Offset: 0 für den aktuellen Bootvorgang, -1 für den vorangegangenen Bootvorgang, -2 für den davor erfolgten Bootvorgang usw
  • Die zweite Spalte zeigt die Boot-ID, gefolgt von den Zeitstempeln für Beginn und Ende des Zeitraums, über den das System nach dem Bootvorgang aktiv war
Alle Meldungen für den aktuellen Bootvorgang anzeigen
journalctl -b

Wenn Sie die Journalmeldungen für den vorangegangenen Bootvorgang abrufen möchten, hängen Sie einen Offset-Parameter an

Im folgenden Beispiel werden die Meldungen für den vorangegangenen Bootvorgang ausgegeben

journalctl -b -1

Alternativ können Sie die Bootmeldungen nach der Boot-ID auflisten

Verwenden Sie hierzu das Feld _BOOT_ID

journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

Filtern nach Zeitraum

Sie können die Ausgabe von journalctl durch Angabe des Start- oder Enddatums filtern

  • Für Datumsangaben gilt das Format „2014-06-30 9:17:16“
  • Wenn Sie keine Uhrzeit angeben, wird Mitternacht (0:00 Uhr) angenommen
  • Wenn die Sekundenangabe fehlt, wird „:00“ angenommen
  • Wenn Sie kein Datum angeben, wird das aktuelle Datum angenommen
  • Statt eines numerischen Ausdrucks können Sie die Schlüsselwörter „gestern“, „heute“ oder „morgen“ angeben
  • Diese Wörter bezeichnen Mitternacht am Tag vor dem aktuellen Tag, am aktuellen Tag bzw
  • am Tag nach dem aktuellen Tag
  • Das Schlüsselwort „now“ (jetzt) verweist auf die aktuelle Uhrzeit am heutigen Tag
  • Auch relative Zeitangaben mit dem Präfix - oder + sind möglich
  • Diese Zeitangaben verweisen dann entsprechend auf eine Uhrzeit vor oder nach der aktuellen Uhrzeit

Nur neue Meldungen ab jetzt anzeigen und Ausgabe entsprechend aktualisieren

journalctl --since "now" -f

Alle Meldungen ab der letzten Mitternacht bis 3:20 Uhr anzeigen

journalctl --since "today" --until "3:20"

Filtern nach Feldern

Sie können die Ausgabe des Journals nach bestimmten Feldern filtern

  • Die Syntax für ein abzugleichendes Feld lautet FELDNAME=FILTERKRITERIUM, beispielsweise _SYSTEMD_UNIT=httpd.service
  • Wenn Sie mehrere Filterkriterien in einer einzigen Abfrage angeben, werden die Ausgabemeldungen noch stärker gefiltert
  • Eine Liste der Standardfelder finden Sie auf der man-Seite man 7 systemd.journal-fields

Meldungen anzeigen, die von einer bestimmten Prozess-ID erzeugt wurden

journalctl _PID=1039

Meldungen anzeigen, die zu einer bestimmten Benutzer-ID gehören

journalctl _UID=1000

Meldungen aus dem Kernel-Ring-Puffer anzeigen (entspricht der Ausgabe von dmesg)

journalctl _TRANSPORT=kernel

Meldungen aus der Standard- oder Fehlerausgabe des Services anzeigen

journalctl _TRANSPORT=stdout

Nur Meldungen anzeigen, die von einem bestimmten Service erzeugt wurden

journalctl _SYSTEMD_UNIT=avahi-daemon.service

Wenn Sie zwei verschiedene Felder angeben, werden nur solche Einträge zurückgegeben, die beide Ausdrücke gleichzeitig erfüllen

journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1488

Wenn Sie zwei Kriterien für dasselbe Feld angeben, werden alle Einträge zurückgegeben, die einen dieser Ausdrücke erfüllen

journalctl _SYSTEMD_UNIT=avahi-daemon.service _SYSTEMD_UNIT=dbus.service

Mit dem Begrenzungszeichen „+“ verbinden Sie zwei Ausdrücke mit einem logischen „OR“

  • Im folgenden Beispiel werden alle Meldungen aus dem Avahi-Service mit der Prozess-ID 1480 zusammen mit allen Meldungen vom D-Bus-Service gezeigt
journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

Untersuchen von systemd-Fehlern

In diesem Abschnitt wird an einem einfachen Beispiel erläutert, wie Sie die Fehler auffinden und beheben, die systemd beim Starten von apache2 meldet

Versuchen Sie, den apache2-Service zu starten

systemctl start apache2
Job for apache2.service failed
See 'systemctl status apache2' and 'journalctl -xn' for details

Prüfen Sie den Status dieses Service

systemctl status apache2 apache2.service - The Apache Webserver
Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
Active: failed (Result: exit-code) since Tue 2014-06-03 11:08:13 CEST; 7min ago
Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND \
  -k graceful-stop (code=exited, status=1/FAILURE)* Die ID des Prozesses, der den Fehler verursacht, lautet 11026

Rufen Sie die ausführliche Version der Meldungen zur Prozess-ID 11026 ab

journalctl -o verbose _PID=11026
[...] MESSAGE=AH00526: Syntax error on line 6 of /etc/apache2/default-server.conf
[...] MESSAGE=Invalid command 'DocumenttRoot', perhaps misspelled or defined by a module [...]

Korrigieren Sie den Schreibfehler in /etc/apache2/default-server.conf, starten Sie den apache2-Service, und lassen Sie den Status ausgeben

systemctl start apache2 && systemctl status apache2 apache2.service - The Apache Webserver
Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
Active: active (running) since Tue 2014-06-03 11:26:24 CEST; 4ms ago
Process: 11026 ExecStop=/usr/sbin/start_apache2 -D SYSTEMD -DFOREGROUND
  -k graceful-stop (code=exited, status=1/FAILURE)
Main PID: 11263 (httpd2-prefork)
Status: "Processing requests..."
CGroup: /system.slice/apache2.service
  ├─11263 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
  ├─11280 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
  ├─11281 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
  ├─11282 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
  ├─11283 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]
  └─11285 /usr/sbin/httpd2-prefork -f /etc/apache2/httpd.conf -D [...]

Konfiguration von journald

Das Verhalten des systemd-journald-Service lässt sich in /etc/systemd/journald.conf festlegen

  • In diesem Abschnitt werden lediglich die grundlegenden Optionseinstellungen vorgestellt
  • Eine vollständige Beschreibung der Datei finden Sie auf der man-Seite man 5 journald.conf
  • Damit die Änderungen in Kraft treten, müssen Sie das Journal wie folgt neu starten
systemctl restart systemd-journald

Persistentes Journal

Das Journal speichert die Protokolldaten standardmäßig in /run/log/journal/

  • Das Verzeichnis /run/ ist naturgemäß flüchtig, weshalb die Protokolldaten beim Neubooten verloren gehen
  • Um persistente Protokolldaten zu erzielen, muss das Verzeichnis /var/log/journal/ mit den entsprechenden Angaben zu Eigentümer und Berechtigungen vorhanden sein, damit der systemd-journald-Service die Daten dort speichern kann

So können Sie das Verzeichnis mit systemd erstellen und die persistente Protokollierung aktivieren: # Öffnen Sie die Datei /etc/systemd/journald.conf als root zum Bearbeiten

vi /etc/systemd/journald.conf

Heben Sie die Auskommentierung der Zeile auf, die mit Storage= beginnt, und ändern Sie sie wie folgt

[...]
[Journal]
Storage=persistent
#Compress=yes [...]

Speichern Sie die Datei, und starten Sie systemd-journald neu

systemctl restart systemd-journald

Ändern der Größenbeschränkung für das Journal

Wenn die Journalprotokolldaten an einem persistenten Speicherort gespeichert werden (siehe Abschnitt 15.1, „Festlegen des Journals als persistent“), belegen sie bis zu 10 % des Dateisystems, auf dem sich /var/log/journal befindet

  • Ist /var/log/journal beispielsweise auf einer /var-Partition mit einer Kapazität von 30 GB gespeichert, so kann das Journal bis zu 3 GB des Festplattenspeichers belegen

Zum Bearbeiten dieser Größenbeschränkung ändern Sie die Option SystemMaxUse (und heben Sie die Auskommentierung dieser Option auf)

SystemMaxUse=50M

Weiterleiten des Journals an /dev/ttyX

Sie können das Journal an ein Terminalgerät weiterleiten, so dass Sie an einem bevorzugten Terminalbildschirm (beispielsweise /dev/tty12) über Systemmeldungen informiert werden. Ändern Sie die folgenden journald-Optionen

ForwardToConsole=yes
TTYPath=/dev/tty12

Weiterleiten des Journals an die Syslog-Funktion

journald ist abwärtskompatibel zu herkömmlichen syslog-Implementierungen wie rsyslog

apt install rsyslog
systemctl is-enabled rsyslog

Die Weiterleitung an syslog wird in /etc/systemd/journald.conf aktiviert

ForwardToSyslog=yes

Konfiguration

Dateien

Datei Beschreibung


Anhang

Siehe auch



Dokumentation

Man-Page
  1. prep(1)


Links

Projekt

Weblinks