Das Systemjournal besteht aus dem systemd-journald, kurz journald, der Protokollmeldungen sammelt und speichert, und dem journalctl, das der Verwaltung, Abfrage und Ausgabe der gesammelten Protokollmeldungen dient.
journald ist ein Systemdienst, der mit Hilfe der Unit
systemd-journald.service (und seiner zugehörigen Socket-Units)
Protokollmeldungen sammelt und speichert.
Es erstellt und verwaltet strukturierte, indizierte Journale, basierend
auf den Protokollmeldungen aus:
journald erlaubt Journal-“Namensräume” (namespaces). Sie sind zum Einen ein Mechanismus zur logischen Isolation eines Protokoll-Datenstroms vom Rest des Systems, zum Anderen auch ein Mechanismus zur Steigerung der Leistung. Journal-Namensräume existieren gleichzeitig und nebeneinander. Jeder hat seinen eigenen, unabhängigen Protokolldatenstrom. Nach der Installation von siduction besteht nur der Vorgabe-Namensraum des Systems.
Der journald speichert die Protokolldaten standardmäßig
dauerhaft unter
/var/log/journal/MASCHINENKENNUNG
.
Protokolldaten für andere Namensräume befinden sich in
/var/log/journal/MASCHINENKENNUNG.NAMENSRAUM
.
Der Befehl systemd-cat
bietet zwei
Möglichkeiten um unabhängig von systemd-Units Daten eines Prozesses an
das Journal weiterzugeben.
systemd-cat <Programm> <Option(en)>
Falls kein Parameter übergeben wurde, wird systemd-cat alles, was es von der Standardeingabe liest, an das Journal schicken. Die man-page systemd-cat.1.de bietet weitere Informationen.
Die systemd-journal-Module upload, remote
und gatewayd ermöglichen das Versenden und Empfangen von
System-Protokolldaten zwischen verschiedenen Rechnern über das Netzwerk.
Mit ihrer Hilfe lassen sich entfernte Rechner fortlaufend überwachen. In
dieser Konstellation ist es sinnvoll auf dem Remoterechner Namensräume
für die Protokolldaten der entfernten Rechner einzurichten.
Für weitere Informationen bitte die man-pages journal
upload, journal
remote und journal
gatewayd lesen.
Die folgenden Dateien konfigurieren verschiedene Parameter des systemd-Journal-Dienstes.
Der Vorgabe-Namensraum, den der systemd-journald.service (und seine
zugehörigen Socket-Units) verwaltet, wird in
/etc/systemd/journald.conf
und zugeordneten Ergänzungen
konfiguriert.
Die Konfigurationsdatei enthält die Vorgaben als auskommentierten
Hinweis für den Administrator. Um lokal Einstellungen zu ändern, genügt
es diese Datei zu bearbeiten.
Instanzen, die andere Namensräume verwalten, werden nur benötigt,
wenn von den Vorgaben abgewichen werden muss. Deren Konfigurationsdatei
ist nach dem Muster etc/systemd/journald@NAMENSRAUM.conf
zu
erstellen.
Einem bestimmten Journal-Namensraum können Dienste-Units mittels der
Unit-Dateieinstellung LogNamespace=
zugeordnet werden.
Standardmäßig sammelt nur der Vorgabe-Namensraum Kernel- und Auditprotokollnachrichten.
Rangfolge
Wenn Pakete die Konfiguration anpassen müssen, können sie
Konfigurationsschnipsel in /usr/lib/systemd/*.conf.d/
oder
/usr/local/lib/systemd/*.conf.d/
installieren.
Die Hauptkonfigurationsdatei wird vor jeder anderen aus den
Konfigurationsverzeichnissen gelesen und hat die niedrigste Priorität.
Einträge in einer Datei in jedem der Konfigurationsverzeichnisse setzen
Einträge in der Hauptkonfigurationsdatei außer Kraft. Dateien in den
Unterverzeichnissen *.conf.d/
werden nach ihrem Dateinamen
sortiert, unabhängig davon, in welchem Unterverzeichnis sie sich
befinden. Sofern eigene Konfigurationsdateien nötig sind, wird
empfohlen, allen Dateinamen in diesen Unterverzeichnissen eine
zweistellige Zahl und einen Bindestrich voranzustellen, um die
Sortierung der Dateien zu vereinfachen.
journalctl dient der Abfrage des von systemd-journald
erstellten Journals.
Beim Aufruf ohne Parameter wird der gesamte Inhalt aus allen
zugreifbaren Quellen des Journals angezeigt, beginnend mit dem ältesten
Eintrag.
Die Ausgabe wird seitenweise durch less geleitet. Lange Zeilen
kann man mittels der Pfeil-links
und
Pfeil-rechts
Tasten betrachten. Die Option
--no-pager
deaktiviert die seitenweise Anzeige, wobei die
Zeilen auf die Breite des Terminals verkürzt werden.
journalctl bietet zu den nachfolgend beschriebenen Optionen eine ganze Reihe weiterer Möglichkeiten der Filterung und Aufbereitung der Ausgaben. Bitte auch die man-Page journalctl, Journalabfrage lesen.
Rechte
Dem Benutzer root und allen Benutzern die Mitglied der Gruppen systemd-journal, adm und wheel sind, wird Zugriff auf das System-Journal und die Journale der anderen Benutzer gewährt. Siduction fügt alle konfigurierten USER der Gruppe systemd-journal zu.
Das Journal enthält vertrauenswürdige Felder, d.h. Felder, die implizit vom Journal hinzugefügt werden und durch Client-Code nicht geändert werden können. Sie beginnen mit einem Unterstrich. (z.B.: _PID=, _UID=, _GID=, _COMM=, _EXE=, _CMDLINE= )
Ausgabe filtern
Optionen: --user
, --system
,
--directory=
, --file=
,
--namespace=
Die Optionen begrenzen die Quelle der Ausgabe auf den genannten Bereich,
das Verzeichnis oder die Datei.
Optionen: -b
, -k
,
-u
, -p
, -g
, -S
,
-U
Die Ausgaben dieser Optionen verwenden alle zu Verfügung stehenden
Journal-Dateien, es sei denn, eine der zuvor genannten Optionen wird
zusätzlich verwendet.
-b
--boot=
Zeigt Nachrichten von einem bestimmten Systemstart. Ohne Argument werden
die Protokolle für den aktuellen Systemstart angezeigt. Das Argument
“-1” gibt die Meldungen des Systemstarts vor dem Aktuellen aus. Das
Argument “5” präsentiert die Meldungen des fünften Systemstarts seit
Beginn der Aufzeichnungen.
-k
--dmesg
Zeigt nur Kernelnachrichten. Dies beinhaltet die Option -b
,
sodass nur Kernelmeldungen seit dem aktuellen Systemstart ausgegeben
werden.
-u
--unit=
Diese Option benötigt die Angabe einer UNIT oder eines MUSTERs.
Gibt die Journaleinträge für die angegebene systemd-Unit UNIT oder für
alle Units, die auf das MUSTER passen, aus.
-p
--priority=
Filtert die Ausgabe nach Nachrichtenprioritäten oder
Prioritätsbereichen. Benötigt die Angabe einer einzelnen Protokollstufe,
oder einen Bereich von Protokollstufen in der Form VON..BIS.
Die Protokollstufen sind die normalen Syslog-Protokollstufen:
“emerg” (0), “alert” (1), “crit” (2), “err” (3), “warning” (4), “notice”
(5), “info” (6), “debug” (7)
Als Argument können sowohl die Namen als auch die Ziffern der
Protokollstufen verwendet werden. Falls eine einzelne Protokollstufe
angegeben ist, werden alle Nachrichten mit dieser oder einer niedrigeren
Protokollstufe angezeigt.
-g
--grep=
Benötigt die Angabe eines PERL-kompatiblen regulären Ausdrucks, um die
Ausgabe zu filtern. Der reguläre Ausdruck wird in den Journaleinträgen
auf das Feld “MESSAGE=” angewendet.
-S
--since=
und -U
--until=
Die Anzeige beginnt mit neueren Einträgen ab dem angegebenen Datum oder
älteren Einträgen bis zum angegebenen Datum. Das Datumsformat sollte
“2012-10-30 18:17:16” sein, es können aber auch Teile davon weggelassen
werden. Alternativ sind die Zeichenketten “yesterday”, “today”,
“tomorrow” möglich. Das Argument “now” bezieht sich auf die aktuelle
Zeit. Die Angabe relativer Zeiten ermöglichen ein vorangestelltes “-”
oder “+”, die sich auf Zeiten vor bzw. nach der angegebenen Zeit
beziehen.
Ausgabe steuern
Optionen: -f
, -n
, -r
,
-o
, -x
, --no-pager
-f
--follow
Nur die neusten Journal-Einträge anzeigen und kontinuierlich neue
Einträge ausgeben. Dies beinhaltet die Option -n
. Die
Ausgabe ist vergleichbar mit dem altbekannten Befehl
tail -f /var/log/messages
.
-n
--lines=
Zeigt die neusten Journal-Einträge und begrenzt die Anzahl der zu
zeigenden Ereignisse. Das Argument ist eine positive Ganzzahl. Der
Vorgabewert ist 10, falls kein Argument angegeben wird.
-r
--reverse
Die Ausgabe beginnt mit dem neusten Eintrag.
-o
--output=
Steuert die Formatierung der angezeigten Journal-Einträge. Dieser Option
sind eine ganze Reihe weiterer Optionen untergeordnet, von denen wir
hier nur die Option “short-full” betrachten.
-o short-full
Die Ausgabe ist größtenteils identisch zu der Formatierung klassischer
Syslog-Dateien. Sie zeigt eine Zeile pro Journal-Eintrag an, aber der
Zeitstempel wird im Format, das die Optionen –since= und –until=
akzeptieren, ausgegeben. Deshalb eignet sich diese Ausgabe sehr gut um
nachfolgend eine zeitbezogene Filterung der Journaleinträge zu
erstellen.
-x
- -catalog
Ergänzt Protokollzeilen mit erklärenden Hilfetexten, soweit diese
verfügbar sind.
--no-pager
Die Option deaktiviert die seitenweise Anzeige, wobei die Zeilen auf die
Breite des Terminals verkürzt werden. Sie zu benutzen ist nur sinnvoll,
wenn für die Ausgabe nur eine geringe Anzahl an Zeilen erwartet
wird.
journalctl steuern
Optionen: --disk-usage
, --vacuum-size=
,
--vacuum-time=
, --vacuum-files
,
--rotate
, --verify
Die Optionen behandeln die Verwaltung der von journald
geschriebenen Daten.
--disk-usage
Zeigt den aktuellen Plattenplatzverbrauch aller Journal-Dateien
an.
--vacuum-size=
, --vacuum-time=
,
--vacuum-files
Entfernt die ältesten archivierten Journal-Dateien, bis der
Plattenplatz, den sie verwenden, unter die angegebene Größe fällt oder
alle archivierten Journal-Dateien, die keine Daten älter als die
angegebene Zeitspanne enthalten oder so dass nicht mehr als die
angegebene Anzahl an separaten Journal-Dateien verbleiben. Die
Ausführung von --vacuum-xxx
bezieht nicht die aktiven
Journal-Dateien ein.
--rotate
Bittet den Journal-Daemon, die Journal-Dateien zu rotieren.
Journal-Dateien-Rotation hat den Effekt, dass alle derzeit aktiven
Journal-Dateien als archiviert markiert und umbenannt werden, so dass in
der Zukunft niemals mehr in sie geschrieben wird. Dann werden
stattdessen neue (leere) Journal-Dateien erstellt. Diese Aktion kann mit
--vacuum-xxx
in einem einzigen Befehl kombiniert werden, um
die --vacuum-xxx
mitgegebenen Argumente tatsächlich zu
erreichen.
--verify
Prüft die Journal-Dateien auf interne Konsistenz.
Wie oben unter Rechte beschrieben, kannst Du das Journal als einfacher User benutzen. Hier sind einige Beispiele:
Befehl | Anzeige |
---|---|
journalctl | das volle Journal aller User, älteste Einträge zuerst |
journalctl -r | wie zuvor, neueste Einträge zuerst |
journalctl -b | das Protokoll des letzten Bootvorgangs |
journalctl -b -1 -k | vom vorletzten Bootvorgang (-1) alle Kernelmeldungen |
journalctl -b -p err | limitiert auf den letzten Boot und die Priorität ERROR |
journalctl –since=yesterday | das Journal seit gestern |
journalctl /dev/sda | das Journal der Gerätedatei /dev/sda |
journalctl /usr/bin/dbus-daemon | alle Logs des D-Bus-Daemon |
journalctl -f | Liveansicht des Journal (früher: tail -f /var/log/messages) |
Die Option “`–list-boots*” gibt die entsprechende Liste aus.
# journalctl --list-boots --no-pager
[...]
-50 8fc07f387... Sun 2021-02-28 11:07:05 CET-Sun [...] CET
-49 aa49cb3af... Mon 2021-03-01 17:49:58 CET-Mon [...] CET
-48 3a6e55a4a... Tue 2021-03-02 12:18:46 CET-Tue [...] CET
-47 a46150a19... Wed 2021-03-03 11:06:29 CET-Wed [...] CET
-46 d42ed8b05... Thu 2021-03-04 10:59:56 CET-Thu [...] CET
-45 566f65991... Thu 2021-03-04 19:53:52 CET-Thu [...] CET
-44 8e2da4a61... Fri 2021-03-05 10:15:18 CET-Fri [...] CET
[...]
Anschließend kannst du dir mit dem Befehl
journalctl -b -47
die Meldungen des
Bootvorgangs vom 3.3.2021 anzeigen lassen.
Eine weitere Neuerung beim Protokollieren ist die
Tab-Vervollständigung für journalctl. Wenn Du journalctl
schreibst, und zwei mal die TAB
Taste
drückst, erscheint eine Liste möglicher Vervollständigungen:
$ journalctl
_AUDIT_FIELD_APPARMOR= _KERNEL_SUBSYSTEM=
_AUDIT_FIELD_CAPABILITY= KERNEL_USEC=
_AUDIT_FIELD_CAPNAME= LEADER=
_AUDIT_FIELD_DENIED_MASK= LIMIT=
_AUDIT_FIELD_INFO= LIMIT_PRETTY=
_AUDIT_FIELD_NAME= _LINE_BREAK=
_AUDIT_FIELD_OPERATION= _MACHINE_ID=
_AUDIT_FIELD_OUID= MAX_USE=
_AUDIT_FIELD_PEER= MAX_USE_PRETTY=
_AUDIT_FIELD_PROFILE= MESSAGE=
_AUDIT_FIELD_REQUESTED_MASK= MESSAGE_ID=
_AUDIT_FIELD_SIGNAL= NM_CONNECTION=
_AUDIT_ID= NM_DEVICE=
_AUDIT_LOGINUID= NM_LOG_DOMAINS=
_AUDIT_SESSION= NM_LOG_LEVEL=
_AUDIT_TYPE= N_RESTARTS=
_AUDIT_TYPE_NAME= _PID=
AVAILABLE= PRIORITY=
AVAILABLE_PRETTY= SEAT_ID=
_BOOT_ID= _SELINUX_CONTEXT=
_CAP_EFFECTIVE= SESSION_ID=
_CMDLINE= SHUTDOWN=
CODE_FILE= SLEEP=
CODE_FUNC= _SOURCE_MONOTONIC_TIMESTAMP=
CODE_LINE= _SOURCE_REALTIME_TIMESTAMP=
_COMM= _STREAM_ID=
COMMAND= SYSLOG_FACILITY=
CONFIG_FILE= SYSLOG_IDENTIFIER=
CONFIG_LINE= SYSLOG_PID=
CURRENT_USE= SYSLOG_RAW=
CURRENT_USE_PRETTY= SYSLOG_TIMESTAMP=
DISK_AVAILABLE= _SYSTEMD_CGROUP=
DISK_AVAILABLE_PRETTY= _SYSTEMD_INVOCATION_ID=
DISK_KEEP_FREE= _SYSTEMD_OWNER_UID=
DISK_KEEP_FREE_PRETTY= _SYSTEMD_SESSION=
ERRNO= _SYSTEMD_SLICE=
_EXE= _SYSTEMD_UNIT=
EXECUTABLE= _SYSTEMD_USER_SLICE=
EXIT_CODE= _SYSTEMD_USER_UNIT=
EXIT_STATUS= THREAD_ID=
_FSUID= TIMESTAMP_BOOTTIME=
_GID= TIMESTAMP_MONOTONIC=
GLIB_DOMAIN= _TRANSPORT=
GLIB_OLD_LOG_API= _UDEV_DEVNODE=
_HOSTNAME= _UDEV_SYSNAME=
INVOCATION_ID= _UID=
JOB_ID= UNIT=
JOB_RESULT= UNIT_RESULT=
JOB_TYPE= USER_ID=
JOURNAL_NAME= USER_INVOCATION_ID=
JOURNAL_PATH= USERSPACE_USEC=
_KERNEL_DEVICE= USER_UNIT=
Die meisten davon sind selbsterklärend. Beispielsweise COMM, was für command steht, bedient eine Menge an Optionen:
journalctl _COMM=
listet nach einem
weiterer Druck auf TAB die möglichen Applikationen:
$ journalctl _COMM=
acpid hddtemp ntpdate systemd
acpi-fakekey hdparm ntpd systemd-fsck
acpi-support hp ofono systemd-hostnam
alsactl hpfax ofonod systemd-journal
anacron ifup pkexec systemd-logind
apache2 irqbalance polkitd systemd-modules
backlighthelper kbd pulseaudio systemd-shutdow
bash kdm pywwetha systemd-udevd
bluetoothd keyboard-setup pywwetha.py teamviewerd
chfn loadcpufreq resolvconf udev-configure-
chrome logger rpcbind udisksd
console-kit-dae login rpc.statd udisks-daemon
console-setup lvm samba-ad-dc umount
cpufrequtils lvm2 saned uptimed
cron mbd sensors useradd
cups mbmon sh usermod
dbus-daemon mdadm smartmontools vboxdrv
ddclient mdadm-raid smbd VBoxExtPackHelp
docvert-convert mtp-probe ssh vdr
glances mysql sshd winbind
gpasswd networking su
gpm nfs-common sudo
groupadd ntp sysstat
Mit journalctl _COMM=su
kannst du nun
sehen, welcher User sich wann mit “su” root-Rechte verschafft hat.
# journalctl _COMM=su
-- boot 1b5d2b3fcd9043d88d8abce665b75ed4 --
Mar 10 16:27:22 pc1 su[105197]: (to root) siduser on pts/1
Mar 10 16:27:22 pc1 su[105197]: pam_unix(su:session):
session opened for user root(uid=0) by (uid=1000)
Mar 10 17:54:33 pc1 su[105197]: pam_unix(su:session):
session closed for user root
-- boot 37b19f6321814620be1ed4deb3be467f --
Mar 10 17:56:35 pc1 su[3381]: (to root) siduser on pts/1
Mar 10 17:56:35 pc1 su[3381]: pam_unix(su:session):
session opened for user root(uid=0) by (uid=1000)
Mar 10 19:07:17 pc1 su[3381]: pam_unix(su:session):
session closed for user root
Ein anderes Beispiel:
Man kann die Ausgabe zusätzlich zeitlich eingrenzen.
# journalctl _COMM=dbus-daemon --since=2020-04-06 --until="2020-04-07 23:40:00"
[...]
Apr 07 22:59:04 pc1 org.gtk.Private.GPhoto2VolumeMonitor[2006]: ### debug: in handle_supported
Apr 07 22:59:04 pc1 org.gtk.Private.GPhoto2VolumeMonitor[2006]: ### debug: in handle_list
Apr 07 22:59:04 pc1 org.gtk.Private.GoaVolumeMonitor[2006]: ### debug: in handle_supported
Apr 07 22:59:04 pc1 org.gtk.Private.GoaVolumeMonitor[2006]: ### debug: in handle_list
Apr 07 23:03:09 pc1 org.gtk.Private.GPhoto2VolumeMonitor[2006]: ### debug: Name owner ':1.4320' vanished
Apr 07 23:03:09 pc1 org.gtk.Private.GoaVolumeMonitor[2006]: ### debug: Name owner ':1.4320' vanished
Apr 07 23:03:09 pc1 org.gtk.Private.AfcVolumeMonitor[2006]: ### debug: Name owner ':1.4320' vanished
Apr 07 23:03:09 pc1 org.gtk.Private.MTPVolumeMonitor[2006]: ### debug: Name owner ':1.4320' vanished
Viele der oben genannten Optionen lassen sich miteinander kombinieren, damit nur die gesuchten Journaleinträge angezeigt werden. Die man-page von journalctl beschreibt alle Optionen ausführlich.
systemd-journald
journald
Konfiguration
journalctl,
Journalabfrage
journal
gatewayd
journal
remote
journal
upload
systemd-cat.1.de
Dank an Helge Kreuzmann für die deutschen Übersetzungen.