Fortgeschrittene Techniken zur Fehlerbehebung mit Systemd Journald

Fehlerbehebung mit Systemd-Journalprotokollen mittels Zeitfiltern, Boot-Auswahl, Einheitenabfragen, Prioritätsstufen und Exporten.

Fortgeschrittene Techniken zur Fehlerbehebung mit Systemd Journald

Die Fehlersuche auf einem systemd-basierten Linux-Host beginnt oft im Journal. journalctl -xe kann aktuelle Fehler anzeigen, aber echte Fehlerbehebung bedeutet normalerweise, Protokolle nach Boot, Zeitbereich, Einheit, Priorität, Prozess oder ausführbarer Datei einzugrenzen.

Die folgenden Beispiele zeigen, wie Sie aus einem großen Journal eine fokussierte Ansicht erstellen, die Sie bei Dienstausfällen, Boot-Problemen und wiederkehrenden Systemfehlern verwenden können.

Das Journal verstehen: Struktur und Speicherort

Das systemd-Journal sammelt Protokolle vom Kernel, Systemdiensten und Anwendungen. Im Gegensatz zu traditionellen Syslog-Dateien speichert das Journal Protokolle in einem indizierten, binären Format, das anspruchsvolle Abfragen über journalctl ermöglicht. Protokolle werden normalerweise in Verzeichnissen wie /var/log/journal/ gespeichert.

Wichtige Konzepte, die Sie sich merken sollten:

  • Strukturierte Protokollierung: Einträge enthalten Metadatenfelder (wie _PID, _COMM, _SYSTEMD_UNIT), die journalctl zum Filtern verwendet.
  • Flüchtig vs. Dauerhaft: Protokolle können nur im Arbeitsspeicher (flüchtig) oder auf der Festplatte (dauerhaft) gespeichert werden. Die Standardkonfiguration bevorzugt normalerweise die Dauerhaftigkeit.

Wesentliche fortgeschrittene Filtertechniken

Die Stärke von journalctl liegt in seiner Fähigkeit, Millionen von Protokolleinträgen einzugrenzen. Hier sind die effektivsten fortgeschrittenen Filter.

1. Zeitbasierte Filterung

Zeitbereiche sind entscheidend für die Diagnose vorübergehender Probleme oder Leistungseinbußen. Sie können die Zeit mit absoluten Formaten oder relativen Ankern angeben.

A. Relative Zeit: Verwenden Sie -S (seit) und -U (bis) für relative Zeitangaben.

# Zeigt Protokolle der letzten 30 Minuten an
journalctl --since "30 minutes ago"

# Zeigt Protokolle zwischen gestern 10:00 Uhr und jetzt an
journalctl -S yesterday -U now

# Zeigt Protokolle eines bestimmten Zeitbereichs an (ISO 8601-Format)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 08:15:00"

B. Boot-basierte Zeit: Um eine bestimmte problematische Boot-Sequenz zu analysieren, verwenden Sie das Flag -b.

# Zeigt nur Protokolle des aktuellen Boots an
journalctl -b

# Zeigt Protokolle des vorherigen Boots an
journalctl -b -1

# Zeigt Kernel-Protokolle des vorletzten Boots an
journalctl -b -2 -k

2. Filtern nach Systemd-Einheit und Dienst

Um Protokolle zu isolieren, die zu einem bestimmten Dienst gehören, verwenden Sie das Flag -u oder --unit. Dies ist unverzichtbar bei der Fehlersuche an fehlgeschlagenen Diensten.

# Zeigt alle Protokolle für den Apache-Webserver-Dienst an
journalctl -u httpd.service

# Zeigt Protokolle für den Dienst seit dem letzten Start an
journalctl -u nginx.service --since "start of job -1"

3. Filtern nach Prozess-ID (PID) und ausführbarem Namen

Wenn ein bestimmter Prozess abstürzt, Sie aber nicht sofort wissen, welcher Dienst ihn besitzt, ist das Filtern nach PID oder dem ausführbaren Namen (_COMM) sehr effektiv.

# Zeigt Protokolle zu einer bestimmten Prozess-ID an (z.B. PID 4589)
journalctl _PID=4589

# Zeigt Protokolle für alle Prozesse mit dem Namen 'mysqld' an
journalctl _COMM=mysqld

4. Filtern nach Prioritätsstufe

Journal-Einträgen werden numerische Prioritäten zugewiesen (0=emerg, 7=debug). Verwenden Sie das Flag -p, um nach Schweregrad zu filtern. Dies hilft, übermäßige Debug-Ausgaben zu unterdrücken, wenn Sie nach Fehlern suchen.

Prioritätsstufe Schlüsselwort Numerischer Wert
Emergency emerg 0
Alert alert 1
Critical crit 2
Error err 3
Warning warning 4
Notice notice 5
Info info 6
Debug debug 7
# Zeigt nur kritische Fehler (Stufe 2) und höher für das System an
journalctl -p crit

# Zeigt alle Protokolle außer Debug-Meldungen an
journalctl -p 6

Analyse von Boot-Fehlern und Kernel-Meldungen

Die Fehlerbehebung bei Systemstartproblemen erfordert die Trennung von Fehlern im Benutzerbereich von Kernel- oder Hardware-Initialisierungsproblemen.

Isolieren von Kernel-Meldungen (-k oder --dmesg)

Das Flag -k zeigt nur Kernel-Meldungen an (entspricht der Ausführung von dmesg). Dies ist entscheidend, um Probleme mit Gerätetreibern, Hardwareerkennung oder frühen Initialisierungsfehlern zu identifizieren, bevor systemd überhaupt Dienste lädt.

# Alle Kernel-Meldungen des aktuellen Boots anzeigen
journalctl -k

# Nach bestimmten Hardware-Fehlern im Kernel-Log des vorherigen Boots suchen
journalctl -k -b -1 | grep -i "error"

Verfolgen von Dienstabhängigkeiten

Wenn ein Dienst nicht startet, kann dies an einer fehlgeschlagenen vorgelagerten Abhängigkeit liegen. Verwenden Sie die umgekehrte Anzeige (-r) in Kombination mit der Einheitenfilterung, um die Sequenz zu sehen, die zum Fehler führt.

# Protokolle für eine Einheit in umgekehrter chronologischer Reihenfolge anzeigen
journalctl -u my-app.service -r

Fortgeschrittene Ausgabeformatierung und Export

Für tiefere Analysen oder das Teilen von Protokollen ist die Änderung des Ausgabeformats unerlässlich.

1. Anzeige als JSON (-o json)

Für Skripterstellung oder Integration mit externen Log-Analyse-Tools wird eine strukturierte JSON-Ausgabe bevorzugt.

journalctl -u sshd.service -o json

2. Anzeige als einzelne Zeile (-o cat)

Um eine saubere, rohe Ausgabe ohne Zeitstempel oder Metadaten zu erhalten (nützlich bei der direkten Weiterleitung an andere Tools wie grep), verwenden Sie das cat-Format.

journalctl -u cron.service -o cat

3. Exportieren von Protokollen

Um Protokolle zu archivieren oder zu übertragen, exportieren Sie sie in eine Standard-Textdatei. Wenn Sie bestimmte Metadatenfelder benötigen, wählen Sie ein Ausgabeformat, das strukturierte Felder enthält.

# Alle Protokolle des aktuellen Boots in eine Textdatei exportieren
journalctl -b > boot_log_$(date +%F).txt

# Ausgewählte strukturierte Felder für eine Einheit exportieren
journalctl -u mariadb.service -o json --output-fields=__REALTIME_TIMESTAMP,PRIORITY,_PID,_COMM,MESSAGE --since today > mariadb_recent.json

Best Practices für die Journal-Verwaltung

Die Verwaltung der Journal-Größe ist entscheidend, um eine Erschöpfung des Festplattenspeichers zu verhindern, insbesondere auf Systemen mit hohem Protokollaufkommen.

  • Nutzung prüfen: Aktuellen Speicherverbrauch des Journals ermitteln:
    journalctl --disk-usage
    
  • Alte Protokolle bereinigen: Die Journal-Größe nach Zeit oder Speicherplatz mit vacuum-Befehlen begrenzen:
    # Nur Protokolle der letzten 7 Tage behalten
    sudo journalctl --vacuum-time=7d
    
    # Speicherverbrauch auf maximal 500 MB reduzieren
    sudo journalctl --vacuum-size=500M
    

Verwenden Sie Journal-Filter als Eingrenzungswerkzeug: Wählen Sie zuerst den Boot, das Zeitfenster, die Einheit und die Priorität aus, und ändern Sie das Ausgabeformat nur, wenn Sie das Ergebnis archivieren oder parsen müssen.