Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
Navigation
Bezieht sich auf SUSE Linux Enterprise Server 15

15 journalctl: Abfragen des systemd-Journals

Mit dem Wechsel von herkömmlichen init-Skripten zu systemd in SUSE Linux Enterprise 12 (siehe Kapitel 13, Der Daemon systemd) wurde ein eigenes Protokolliersystem eingeführt, das als Journal bezeichnet wird. Alle Systemereignisse werden in das Journal geschrieben, so dass Sie keinen syslog-basierten Service mehr ausführen müssen.

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:

tux > sudo systemctl status systemd-journald
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
[...]

15.1 Festlegen des Journals als persistent

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:

  1. Öffnen Sie die Datei /etc/systemd/journald.conf als root zum Bearbeiten.

    root # vi /etc/systemd/journald.conf
  2. Heben Sie die Auskommentierung der Zeile auf, die mit Storage= beginnt, und ändern Sie sie wie folgt:

    [...]
    [Journal]
    Storage=persistent
    #Compress=yes
    [...]
  3. Speichern Sie die Datei, und starten Sie systemd-journald neu:

    root # systemctl restart systemd-journald

15.2 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
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:

tux > sudo 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. Dies entspricht der Feldzuordnung _TRANSPORT=kernel (siehe Abschnitt 15.3.3, „Filtern nach Feldern“).

-u

Zeigt nur Meldungen für die angegebene systemd-Einheit an. Dies entspricht der Feldzuordnung _SYSTEMD_UNIT=UNIT (siehe Abschnitt 15.3.3, „Filtern nach Feldern“).

tux > sudo 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.

15.3 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.

15.3.1 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:

tux > sudo journalctl --list-boots
-1 097ed2cd99124a2391d2cffab1b566f0 Mon 2014-05-26 08:36:56 EDT—Fri 2014-05-30 05:33:44 EDT
 0 156019a44a774a0bb0148a92df4af81b 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:

tux > sudo 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:

tux > sudo journalctl -b -1

Alternativ können Sie die Bootmeldungen nach der Boot-ID auflisten. Verwenden Sie hierzu das Feld _BOOT_ID:

tux > sudo journalctl _BOOT_ID=156019a44a774a0bb0148a92df4af81b

15.3.2 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:

tux > sudo journalctl --since "now" -f

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

tux > sudo journalctl --since "today" --until "3:20"

15.3.3 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:

tux > sudo 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):

tux > sudo journalctl _TRANSPORT=kernel

Meldungen aus der Standard- oder Fehlerausgabe des Services anzeigen:

tux > sudo journalctl _TRANSPORT=stdout

Nur Meldungen anzeigen, die von einem bestimmten Service erzeugt wurden:

tux > sudo 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:

tux > sudo 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:

tux > sudo 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:

tux > sudo journalctl _SYSTEMD_UNIT=avahi-daemon.service _PID=1480 + _SYSTEMD_UNIT=dbus.service

15.4 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.

  1. Versuchen Sie, den apache2-Service zu starten:

    # systemctl start apache2
    Job for apache2.service failed. See 'systemctl status apache2' and 'journalctl -xn' for details.
  2. Prüfen Sie den Status dieses Service:

    tux > sudo 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.

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

    tux > sudo 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
    [...]
  4. Korrigieren Sie den Schreibfehler in /etc/apache2/default-server.conf, starten Sie den apache2-Service, und lassen Sie den Status ausgeben:

    tux > sudo 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 [...]

15.5 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:

tux > sudo systemctl restart systemd-journald

15.5.1 Ä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

15.5.2 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

15.5.3 Weiterleiten des Journals an die Syslog-Funktion

journald ist abwärtskompatibel zu herkömmlichen syslog-Implementierungen wie rsyslog. Prüfen Sie Folgendes:

  • rsyslog ist installiert.

    tux > sudo rpm -q rsyslog
    rsyslog-7.4.8-2.16.x86_64
  • Der rsyslog-Service ist aktiviert.

    tux > sudo systemctl is-enabled rsyslog
    enabled
  • Die Weiterleitung an syslog wird in /etc/systemd/journald.conf aktiviert.

    ForwardToSyslog=yes

15.6 Filtern des systemd-Journals mit YaST

Mit dem YaST-Journalmodul filtern Sie das systemd-Journal schnell und einfach (ohne die journalctl-Syntax verwenden zu müssen). Installieren Sie das Modul mit sudo zypper in yast2-journal und starten Sie es dann in YaST mit System › systemd Journal. Alternativ starten Sie das Modul von der Befehlszeile aus mit dem Befehl sudo yast2 journal.

YaST-systemd-Journal
Abbildung 15.1: YaST-systemd-Journal

Das Modul zeigt die Protokolleinträge in einer Tabelle. Im Suchfeld oben suchen Sie nach Einträgen, die bestimmte Zeichen enthalten, ähnlich wie mit grep. Zum Filtern der Einträge nach Datum/Uhrzeit, Einheit, Datei oder Priorität klicken Sie auf Change filters (Filter ändern) und legen Sie die jeweiligen Optionen fest.

15.7 Abrufen von Protokollen in GNOME

Sie können das Journal mit den GNOME-Protokollen abrufen. Starten Sie dieses Kommando über das Anwendungsmenü. Zum Abrufen von Systemprotokollmeldungen muss dieses Kommando als Root ausgeführt werden, beispielsweise mit xdg-su gnome-logs. Dieses Kommando kann mit AltF2 ausgeführt werden.