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.
- Verwalten des Systemstartprozesses und der Dienste (SysVinit, Systemd und Upstart)
- Petiti – Ein Open-Source-Protokollanalysetool für Linux-SysAdmins
- So richten Sie die Protokollrotation mit Logrotate unter Linux ein und verwalten sie
- 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.