journalctl
journalctl - Abfragen des Systemd-Journals
Beschreibung
journalctl dient der Abfrage von Inhalten des Journals von Systemd wie von Journald geschrieben
- 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
 
- Journal abfragen
 
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, sodass 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
 
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
 [...]
Installation
Aufruf
Optionen
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 
| Option | Beschreibung | 
|---|---|
| -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, sodass 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
 
 | 
- 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
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
 
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: 
0für den aktuellen Bootvorgang,-1für den vorangegangenen Bootvorgang,-2fü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
Filtern nach Kritikalität
Sie können journalctl nach Kritikalität filtern, indem Sie die Option -p mit einer Prioritätsstufe verwenden, wie z. B. err für Fehler, crit für kritisch oder alert für Alarm. Diese Option zeigt nur Einträge mit der angegebenen Priorität oder höher an. Die Prioritäten reichen von 0: emerg bis 7: debug, wobei niedrigere Nummern eine höhere Kritikalität bedeuten.
- Fehler und höher anzeigen
 
journalctl -p err
- Nur kritische Nachrichten anzeigen (und höher)
 
journalctl -p crit
- Alle Meldungen ab „error“ im aktuellen Boot-Vorgang anzeigen
 
journalctl -p err -b
- Prioritätsstufen (von kritisch zu unwichtig)
 
emerg (0: Notfall) alert (1: Alarm) crit (2: kritisch) err (3: Fehler) warning (4: Warnung) notice (5: Hinweis) info (6: Information) debug (7: Fehlersuche)
Untersuchen von 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 [...]
Anhang
Siehe auch
Dokumentation
- Man-Page