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), diejournalctlzum 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.