systemd

Master Journalctl Systemd Logs verstehen

Master Journalctl Systemd Logs verstehen
Systemd ist das neue Tool zur Verwaltung von Diensten. Es wurde ursprünglich von Red Hat entwickelt und ermöglicht eine bessere Verwaltung von Diensten über einen zentralisierten Prozess, der Dienste nach Bedarf überwacht und startet. Aber systemd beinhaltet auch ein Container-System, ein Cron-System, eine Möglichkeit, Dienste auf sichere Weise temporäre Verzeichnisse bereitzustellen, und auch ein Logging-System - darauf konzentrieren wir uns hier.

Logs zu verstehen ist wichtig: Wenn Sie jemals auf einen Server fallen, der einen Fehler hat oder gehackt wird, können Sie im Allgemeinen nur über Logs verstehen, was passiert ist. Die Hauptanwendung, die wir verwenden werden, ist journalctl, daher der Name des Artikels. Also genau hinhören wie am richtigen Tag, vielleicht freut ihr euch zu wissen, wie es geht.

Wo werden Systemprotokolle gespeichert?? Und in welchem ​​Format wird es gespeichert??

Wir gehen davon aus, dass Sie ein normales System haben, denn systemd kann an außergewöhnliche Orte angepasst werden in. Auch einige Linux-Distributionen wie Ubuntu 16.04 hat die permanente Protokollierung standardmäßig deaktiviert, was verhindert, dass systemd seine Arbeit richtig macht. Wenn Sie eine solche Verteilung haben, bearbeiten Sie /etc/systemd/journald.conf-Datei ändern, Storage=auto in Storage=persistent ändern und schließlich neu starten re.

So finden Sie normalerweise die systemd-Protokolldateien in /var/log/journal. Das Journaling-System selbst ist ein Dienst namens system-journald.Bedienung.  Versuchen wir, die Dateien in diesem Verzeichnis aufzulisten:

# ls /var/log/journal/ -R
/var/log/journal/:
15e43c1734090ac7fbea6b40fcd99d31
 
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31:
[email protected]~
system@62ac1299826d036cb043d6c06a9493b7-0000000000000001-00067d6410099a19.Tagebuch
[email protected]~
user-1000@2123bc076b58569fe1fb13e9dbc1b0e0-00000000000000001-0007fe36ac2810e0.Tagebuch
Benutzer-1000.Tagebuch
[viele andere Dateien wie die oben...]

Da ich möchte, dass Sie weiterlesen, musste ich die Ausgabe kürzen, da sie viele Dateien enthält (in meinem Beispiel mehr als 60 Dateien), sorry dafür! Versucht, vielleicht einen zu öffnen?

# Kopf --bytes=512 /var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/[email protected]
b58569fe1fb13e9dbc1b0e0-000000000000001-0007fe36ac2810e0.Tagebuch
?s,q?n/FLz???Ulz?l?]????
?_?b???z????Ö?y1KN ?ich?eO??W?du?  ?=?x0?L?d?7??X4n#?e? d3l?
p??o|MFO:?!qs?.tK??R?\??1?|5  ????$?G??#?S??;??B7???????t???Ja????mN?q????ZQ
?Yv?e?????BD?C?? wF??d|
?2?? 7???????[??Un?=8????c?2=p?&?"   ?0
????*????_??  ???
5?????yk?G? ?6?|??du??w: #12?Ja??
3      TU;???'?jX??2?x'?=??[[E-Mail geschützt]
[E-Mail geschützt]?_?>??3S???,lR?.?$?G?L???so?/E??M1??q???

Hey, siehst du, das sieht nicht wirklich nach den üblichen Log-Dateien aus, die du richtig siehst? Keine Sorge, diese Datei ist nicht beschädigt, Sie haben gerade einen Aspekt von systemd entdeckt: systemd speichert Dateien in einem Binärformat. Deshalb ist es so klein wie möglich: Strukturierte Daten wie Zeit oder Ort werden direkt im Binärformat gespeichert, was in der Regel weniger Bytes benötigt als Text. Aber das ist nicht der einzige Grund.

systemd speichert nicht nur Protokollzeilen. Sein Ziel ist es, die Überwachung und Exploration von Logs zu vereinfachen. Um bei dieser Aufgabe zu helfen, sind Protokollnachrichten tatsächlich eine Textzeile, die von Daten wie dem Protokollschweregrad (Warnung, Fehler usw.).) oder sogar Felder, die nur für Ihre Bewerbung nützlich wären (z. B. URL angefordert).

# journalctl --output=verbose --all
PRIORITÄT=6
_UID=0
_GID=0
_CAP_EFFECTIVE=3fffffffff
_BOOT_ID=ee4cc2ce7e8273aaffb5fc59c873ce7b
_MACHINE_ID=bc422e0feaab64bb7dd218c24e6830e5
_HOSTNAME=linux
SYSLOG_FACILITY=3
SYSLOG_IDENTIFIER=systemd
UNIT=dnf-makecache.Bedienung
_TRANSPORT=Journal
_PID=1
_COMM=systemd
_EXE=/usr/lib/systemd/systemd
_CMDLINE=/usr/lib/systemd/systemd --switched-root --system --deserialize 76
_SYSTEMD_CGROUP=/init.Umfang
_SYSTEMD_UNIT=init.Umfang
_SYSTEMD_SLICE=-.Scheibe
_SELINUX_CONTEXT=system_u:system_r:init_t:s0
CODE_FILE=src/core/job.c
CODE_LINE=795
CODE_FUNCTION=job_log_status_message
MESSAGE_ID=a76e08846f5f0971371dbb11126e62e1
MESSAGE=Dnf-Makecache gestartet.
# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"    RESULT=done
_SOURCE_REALTIME_TIMESTAMP=1532886335471422

Ich habe dir gesagt, dass es viele Felder gibt (hier gibt es 25 Felder oder 29 zählende Zeitstempel), das gesamte obige Snippet gilt nur für eine einzige Protokollnachricht! Der große Vorteil ist, dass Sie eine Suche durchführen können, indem Sie nach einem beliebigen Feld in dieser Protokollnachricht filtern. Dies ermöglicht Ihnen wirklich eine erweiterte Filterung.

Einer der offensichtlichsten Filter, die Sie möchten, ist die Filterung nach dem Dienst. Wie Sie oben sehen können, gibt es ein UNIT-Feld, mit dem Sie einfach filtern können, um nur Protokollnachrichten von einem Dienst zu erhalten. Dazu erzähle ich dir später mehr.

Aber diese Datenmenge bedeutet auch noch etwas anderes: In fast allen Fällen werden Sie eine Log-Datei nie manuell öffnen und nie den Ordner /var/log/journal berühren. Sie verwenden journalctl für alle Aufgaben im Zusammenhang mit der Protokollierung. Es gibt keine solche Log-Rotation, alles wird durch die Zeit der Log-Nachrichten verwaltet.

Außerdem hängt die Anzahl der Felder davon ab, wie gut die Integration von systemd in Ihre Anwendung ist. Je mehr Felder eine Log-Nachricht enthält, desto besser ist sie. Bei Basissystemdiensten hat systemd bereits für eine gute Integration gesorgt, aber bei anderen Anwendungen und Diensten variiert die Qualität der Integration stark. Normalerweise sollte dies mit der Zeit besser werden, wenn sich die Leute an systemd gewöhnen.

Okay, jetzt ist es an der Zeit, die Funktionen von journalctl zu entdecken.

Die am häufigsten verwendeten Befehle für journalctl

Der erste Befehl, den Sie sich vielleicht ansehen möchten, ist der, der die Protokolle des Linux-Kernels anzeigt. Ja, systemd übernimmt auch die Speicherung der Kernel-Logs, sodass Sie auch die Logs früherer Bootvorgänge abrufen können. Hier ist der Befehl:

# journalctl --catalog --lines=3000 --pager-end "_TRANSPORT=kernel"

Es zeigt Ihnen einen Page, auf dem Sie die letzten Nachrichten sehen können. Mit den Pfeiltasten (↑ / ↓) oder Bild auf / Bild ab . können Sie bis zu den letzten 3.000 Zeilen scrollen. Das Flag -catalog weist Journalctl an, Kontext um Protokollzeilen anzuzeigen, ähnlich wie bei Computerneustarts oder in anderen Kontexten, wenn ein Dienst gestoppt / gestartet wird. Ich setze dieses Flag immer, da der Kontext immer wichtig ist. Es hilft zu wissen, in welcher Situation die Protokollzeile aufgetreten ist, damit Sie erraten können, warum Sie diese Protokollzeile erhalten haben.

Jetzt möchten Sie vielleicht nur die Protokollzeilen des aktuellen Bootvorgangs sehen:

# journalctl --catalog --lines=35000 --pager-end --boot "_TRANSPORT=kernel"

Beachten Sie, dass das Befehlszeilenargument -boot in allen Situationen funktioniert, nicht nur mit den Protokollen des Kernels. Wenn Sie es vorziehen, von vorne zu beginnen:

# journalctl --catalog --boot "_TRANSPORT=kernel"

Ich weiß nicht, ob das bei dir der Fall ist, aber ich habe genug von Kernel-Logs! Und wie wäre es mit einem Gesamtüberblick über Ihre Maschine?

# journalctl --catalog --lines=3000 --pager-end

Wow, es passiert eine Menge Dinge auf Ihrem System! Hier wäre etwas Filterung hilfreich. Einer der am häufigsten verwendeten Filter entspricht einem bestimmten Dienst (wie Ihrem SSH-Server oder HTTP-Server). Der Dateiname der systemd-Unit für den SSH-Dienst ist sshd.Dienst, also:

# journalctl --catalog --lines=3000 --pager-end --unit=sshd.Bedienung

Das ist cool, nicht wahr? Nun, es ist nur verwendbar, wenn Sie den Namen des Dienstes kennen - aber in vielen Fällen kennen Sie den Namen dieses Dienstes nicht. Wenn Sie sich in einer solchen Situation befinden, möchten Sie möglicherweise eine Liste der Dienste, ihrer Beschreibungen und ihres Status:

# systemctl list-units --type=service

Okay, dieses Problem ist jetzt gelöst. Aber manchmal erhalten Sie eine Fehlermeldung von einem externen System wie Ihrer eigenen Website oder von einer Anwendung auf Ihrem Desktop. Sie möchten wahrscheinlich ein bestimmtes Wort oder einen bestimmten Satz in der Protokollnachricht suchen. Seit systemd v237 ist es jetzt möglich.

In journalctl wird bei der Suche die Groß-/Kleinschreibung nicht beachtet, wenn das gesuchte Wort nur in Kleinbuchstaben geschrieben ist. Wenn Sie also nach dem Wort port suchen, wird auch das Wort port mit Großbuchstaben durchsucht. Ein Beispiel:

# journalctl --catalog --lines=3000 --pager-end --grep="port"

Wenn Sie nun nach einem Wort wie CPU suchen, wird nur CPU mit allen Großbuchstaben durchsucht, es wird nicht nach CPU gesucht.

# journalctl --catalog --lines=3000 --pager-end --grep="CPU"

Sie erinnern sich an die Fehlermeldung vom externen System? Im Allgemeinen enthalten diese Nachrichten einen Zeitstempel. Um die Protokollnachricht zu filtern, können Sie diesen Zeitstempel verwenden. journalctl kann Ihnen mit dem Argument -since alle Protokollnachrichten seit einem bestimmten Datum und einer bestimmten Uhrzeit auflisten:

# journalctl --catalog --since="2018-07-30 09:30:00"

Wenn dieses externe System remote ist oder UTC-Zeitstempel verwendet, sollten Sie basierend auf einem UTC-Datum und einer UTC-Uhrzeit filtern und die UTC-Zeitstempel im Terminal anzeigen, damit Sie sie nicht in Ihrem Kopf konvertieren müssen echt verwirrend. Dazu müssen Sie UTC nach der Zeitzeichenfolge im Argument -since - hinzufügen. Sie müssen dann das Flag -utc hinzufügen. Also zum Beispiel:

# journalctl --catalog --since="2018-07-30 10:45:00 UTC" --utc

Beachten Sie, dass Sie das Flag -utc allein verwenden können. In diesem Fall werden grundsätzlich alle Daten und Uhrzeiten in der UTC-Zeitzone angezeigt.

# journalctl --catalog --lines=3000 --pager-end --utc

Logs lassen sich besser mit journalctl . verwalten

Wie Sie bei allen vorherigen Befehlen sehen können, erleichtert systemd journaling das Filtern und damit das Debuggen, da Sie mit einem einzigen Befehl, journalctl ., durch alle Protokollzeilen selektieren können. Einige von Ihnen kannten wahrscheinlich alte Zeiten, in denen Sie jede Datei in /var/log manuell öffnen mussten, um eine allgemeine Vorstellung von dem Problem und den Ereignissen zu erhalten. Mit all den Tipps, die Sie hier gelernt haben, besitzen Sie solide Werkzeuge, um Ihre Protokollnachrichten so anzuzeigen, wie SIE es möchten.

HD-Remastered-Spiele für Linux, die noch nie zuvor eine Linux-Version hatten
Viele Spieleentwickler und -herausgeber entwickeln HD-Remaster alter Spiele, um die Lebensdauer des Franchise zu verlängern. Bitte Fans, die Kompatibi...
So verwenden Sie AutoKey zur Automatisierung von Linux-Spielen
AutoKey ist ein Desktop-Automatisierungsdienstprogramm für Linux und X11, programmiert in Python 3, GTK und Qt. Mithilfe der Skript- und MACRO-Funktio...
So zeigen Sie den FPS-Zähler in Linux-Spielen an
Linux-Gaming bekam einen großen Schub, als Valve 2012 die Linux-Unterstützung für den Steam-Client und seine Spiele ankündigte. Seitdem haben viele AA...