Website-Suche

Protokollnachrichten unter Systemd mit Journalctl verwalten [Umfassende Anleitung]


Systemd ist ein hochmoderner System- und Service-Manager für Linux-Systeme: ein Init-Daemon-Ersatz, der Prozesse beim Systemstart parallel starten soll. Es wird nun in einer Reihe aktueller Mainstream -Verteilung unterstützt, darunter Fedora, Debian, Ubuntu, OpenSuse, Arch, Rhel, CentOS usw.

Zuvor haben wir die Geschichte hinter „init“ und „systemd“ erklärt; Dort haben wir besprochen, was die beiden Daemons sind, warum „init“ technisch durch „systemd“ ersetzt werden musste, sowie die Hauptfunktionen von systemd.

Einer der Hauptvorteile von systemd gegenüber anderen gängigen Init-Systemen ist die Unterstützung der zentralen Verwaltung der System- und Prozessprotokollierung mithilfe eines Journals. In diesem Artikel erfahren Sie, wie Sie Protokollmeldungen unter systemd mithilfe des Befehls journalctl unter Linux verwalten und anzeigen.

Wichtig: Bevor Sie in diesem Handbuch weitermachen, möchten Sie vielleicht lernen, wie Sie „Systemd“-Dienste und -Einheiten mit dem Befehl „Systemctl“ verwalten und auch neue erstellen und ausführen Serviceeinheiten in systemd mithilfe von Shell-Skripten unter Linux. Wenn Sie jedoch mit allen oben genannten Punkten einverstanden sind, lesen Sie weiter.

Konfigurieren von Journald zum Sammeln von Protokollnachrichten unter Systemd

journald ist ein Daemon, der Journaleinträge aus dem gesamten System sammelt und schreibt; Dabei handelt es sich im Wesentlichen um Boot-Meldungen, Meldungen vom Kernel und von Syslog oder verschiedenen Anwendungen. Alle Meldungen werden an einem zentralen Ort – der Journaldatei – gespeichert.

Sie können das Verhalten von journald über seine Standardkonfigurationsdatei steuern: /etc/systemd/journald.conf, die zur Kompilierzeit generiert wird. Diese Datei enthält Optionen, deren Werte Sie ändern können, um sie an Ihre lokalen Umgebungsanforderungen anzupassen.

Unten sehen Sie ein Beispiel dafür, wie die Datei aussieht, angezeigt mit dem Befehl cat.

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

Beachten Sie, dass verschiedene Paketinstallationen und Verwendungskonfigurationsextrakte in /usr/lib/systemd/*.conf.d/ und Laufzeitkonfigurationen in /run/systemd/journald.conf zu finden sind. d/*.conf, die Sie möglicherweise nicht unbedingt verwenden.

Aktivieren Sie die Journaldatenspeicherung auf der Festplatte

Eine Reihe von Linux-Distributionen, darunter Ubuntu und seine Derivate wie Linux Mint, ermöglichen standardmäßig keine dauerhafte Speicherung von Boot-Meldungen auf der Festplatte.

Sie können dies aktivieren, indem Sie die Option „Speicher“ auf „persistent“ setzen, wie unten gezeigt. Dadurch wird das Verzeichnis /var/log/journal erstellt und alle Journaldateien werden darin gespeichert.

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

Für zusätzliche Einstellungen finden Sie die Bedeutung aller Optionen, die konfiguriert werden sollen, im Abschnitt „[Journal]“ durch Eingabe.

man journald.conf

Einstellen der korrekten Systemzeit mit dem Befehl Timedatectl

Stellen Sie für eine zuverlässige Protokollverwaltung unter systemd mithilfe des Journald-Dienstes sicher, dass die Zeiteinstellungen einschließlich der Zeitzone auf dem System korrekt sind.

Um die aktuellen Datums- und Uhrzeiteinstellungen auf Ihrem System anzuzeigen, geben Sie Folgendes ein:

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Um die richtige Zeitzone und möglicherweise die Systemzeit einzustellen, verwenden Sie die folgenden Befehle.

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

Anzeigen von Protokollnachrichten mit dem Befehl „Journalctl“.

journalctl ist ein Dienstprogramm zum Anzeigen des Inhalts des Systemd-Journals (das vom Journald-Dienst geschrieben wird).

Um alle gesammelten Protokolle ohne Filterung anzuzeigen, geben Sie Folgendes ein:

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

Protokollmeldungen basierend auf Boots anzeigen

Mit der Option --list-boots können Sie eine Liste der Startnummern (relativ zum aktuellen Start), ihrer IDs und die Zeitstempel der ersten und letzten Nachricht anzeigen, die dem Start entsprechen.

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

Um die Journaleinträge vom aktuellen Start (Nummer 0) anzuzeigen, verwenden Sie den Schalter -b wie folgt (wie in der Beispielausgabe oben).

journalctl -b

und um ein Journal vom vorherigen Start anzuzeigen, verwenden Sie den relativen Zeiger -1 mit der Option -b wie unten beschrieben.

journalctl -b -1

Alternativ können Sie auch die Boot-ID wie folgt verwenden.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Protokollnachrichten nach Zeit filtern

Um die Zeit im UTC-Format (Coordinated Universal Time) zu verwenden, fügen Sie die Optionen --utc wie folgt hinzu.

journalctl --utc

Um alle Einträge seit einem bestimmten Datum und einer bestimmten Uhrzeit anzuzeigen, z. B. Geben Sie am 15. Juni 2017 um 8:15 Uhr diesen Befehl ein.

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

Aktuelle Protokollnachrichten anzeigen

Um aktuelle Protokollmeldungen anzuzeigen (standardmäßig 10), verwenden Sie das Flag -n wie unten gezeigt.

journalctl -n
journalctl -n 20 

Vom Kernel generierte Protokollmeldungen anzeigen

Um nur Kernel-Meldungen anzuzeigen, ähnlich der Ausgabe des Befehls dmesg, können Sie das Flag -k verwenden.

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

Von Einheiten generierte Protokollnachrichten anzeigen

Um alle Journaleinträge für eine bestimmte Einheit anzuzeigen, verwenden Sie den Schalter -u wie folgt.

journalctl -u apache2.service

Geben Sie diesen Befehl ein, um den aktuellen Startvorgang auf Null zu setzen.

journalctl -b -u apache2.service

Verwenden Sie dies, um Protokolle vom vorherigen Start anzuzeigen.

journalctl -b -1 -u apache2.service

Nachfolgend finden Sie einige weitere nützliche Befehle:

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

Von Prozessen generierte Protokollmeldungen anzeigen

Um von einem bestimmten Prozess generierte Protokolle anzuzeigen, geben Sie dessen PID wie folgt an.

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

Anzeigen von Protokollnachrichten, die von der Benutzer- oder Gruppen-ID generiert wurden

Um Protokolle anzuzeigen, die von einem bestimmten Benutzer oder einer bestimmten Gruppe erstellt wurden, geben Sie dessen Benutzer- oder Gruppen-ID wie folgt an.

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

Von einer Datei generierte Protokolle anzeigen

Um alle von einer Datei (möglicherweise einer ausführbaren Datei) generierten Protokolle anzuzeigen, z. B. die ausführbare D-Bus-Datei oder die ausführbaren Bash-Dateien, geben Sie einfach Folgendes ein.

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

Protokollnachrichten nach Priorität anzeigen

Sie können die Ausgabe auch basierend auf Nachrichtenprioritäten oder Prioritätsbereichen filtern, indem Sie das Flag -p verwenden. Die möglichen Werte sind: 0 – Emerg, 1 – Alert, 2 – Crit, 3 – Err, 4 – Warning, 5 – Notice, 6 – Info, 7 – Debug):

journalctl -p err

Um einen Bereich anzugeben, verwenden Sie das folgende Format (Notfall bis Warnung).

journalctl -p 1..4
OR
journalctl -p emerg..warning

Protokollmeldungen in Echtzeit anzeigen

Mit der Option -f (ähnlich der Funktionalität tail -f) können Sie Protokolle praktisch beobachten, während sie geschrieben werden.

journalctl -f

Umgang mit der Formatierung der Journalanzeige

Wenn Sie die Ausgabeformatierung der Journaleinträge steuern möchten, fügen Sie das Flag -o hinzu und verwenden Sie diese Optionen: cat, export, json, json-pretty, json-sse, short, short-iso, kurz-monoton, kurz-präzise und ausführlich (überprüfen Sie die Bedeutung der Optionen in der Manpage:

Die Option cat zeigt die tatsächliche Nachricht jedes Journaleintrags ohne Metadaten (Zeitstempel usw.) an.

journalctl -b -u apache2.service -o cat

Journale auf einem System verwalten

Um die Journaldatei auf interne Konsistenz zu überprüfen, verwenden Sie die Option --verify. Wenn alles in Ordnung ist, sollte die Ausgabe ein PASS anzeigen.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Alte Journaldateien löschen

Sie können die aktuelle Festplattennutzung aller Journaldateien auch mit den Optionen --disk-usage anzeigen. Es zeigt die Summe der Festplattennutzung aller archivierten und aktiven Journaldateien:

journalctl --disk-usage

Um alte (archivierte) Journaldateien zu löschen, führen Sie die folgenden Befehle aus:

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

Rotierende Journaldateien

Zu guter Letzt können Sie Journald mit der Option --rotate anweisen, Journaldateien zu rotieren. Beachten Sie, dass diese Anweisung erst zurückkehrt, wenn der Rotationsvorgang abgeschlossen ist:

sudo journalctl --rotate

Eine ausführliche Gebrauchsanweisung und Optionen finden Sie in der Manpage „journalctl“ wie folgt.

man journalctl

Schauen Sie sich einige nützliche Artikel an.

  1. Verwalten des Systemstartprozesses und der Dienste (SysVinit, Systemd und Upstart)
  2. Petiti – Ein Open-Source-Protokollanalysetool für Linux-SysAdmins
  3. So richten Sie die Protokollrotation mit Logrotate unter Linux ein und verwalten sie
  4. lnav – Überwachen und analysieren Sie Apache-Protokolle von einem Linux-Terminal aus

Das war es fürs Erste. Nutzen Sie das Feedback von unten, um Fragen zu stellen oder Ihre Gedanken zu diesem Thema hinzuzufügen.