Tecniche Avanzate di Risoluzione dei Problemi con Systemd Journald
Risolvi i problemi dei log di systemd journal con filtri temporali, selezione dell'avvio, query per unità, livelli di priorità ed esportazioni.
Tecniche Avanzate di Risoluzione dei Problemi con Systemd Journald
Il debug di un host Linux basato su systemd spesso inizia dal journal. journalctl -xe può mostrare errori recenti, ma la vera risoluzione dei problemi di solito significa restringere i log per avvio, intervallo di tempo, unità, priorità, processo o eseguibile.
Gli esempi seguenti mostrano come trasformare un journal di grandi dimensioni in una vista mirata che puoi utilizzare durante guasti di servizi, problemi di avvio ed errori di sistema ricorrenti.
Comprendere il Journal: Struttura e Posizione
Il Journal di systemd aggrega i log dal kernel, dai servizi di sistema e dalle applicazioni. A differenza dei file syslog tradizionali, il Journal memorizza i log in un formato binario indicizzato, che consente query sofisticate tramite journalctl. I log vengono generalmente conservati in directory come /var/log/journal/.
Concetti chiave da ricordare:
- Logging Strutturato: Le voci contengono campi di metadati (come
_PID,_COMM,_SYSTEMD_UNIT) chejournalctlutilizza per il filtraggio. - Volatile vs. Persistente: I log possono essere memorizzati solo in memoria (volatile) o scritti su disco (persistente). La configurazione predefinita di solito favorisce la persistenza.
Tecniche Essenziali di Filtraggio Avanzato
La potenza di journalctl risiede nella sua capacità di restringere milioni di voci di log. Ecco i filtri avanzati più efficaci.
1. Filtraggio Basato sul Tempo
Gli intervalli di tempo sono fondamentali quando si diagnosticano problemi transitori o regressioni delle prestazioni. Puoi specificare il tempo utilizzando formati assoluti o ancore relative.
A. Tempo Relativo: Usa -S (since) e -U (until) per specifiche di tempo relative.
# Mostra i log degli ultimi 30 minuti
journalctl --since "30 minutes ago"
# Mostra i log tra le 10:00 di ieri e ora
journalctl -S yesterday -U now
# Mostra i log da un intervallo di tempo specifico (formato ISO 8601)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 08:15:00"
B. Tempo Basato sull'Avvio: Per analizzare una specifica sequenza di avvio problematica, usa il flag -b.
# Mostra solo i log dell'avvio corrente
journalctl -b
# Mostra i log dell'avvio precedente
journalctl -b -1
# Mostra i log del kernel dell'avvio prima dell'ultimo
journalctl -b -2 -k
2. Filtraggio per Unità e Servizio Systemd
Per isolare i log appartenenti a un servizio specifico, usa il flag -u o --unit. Questo è indispensabile quando si risolvono problemi di servizi non riusciti.
# Mostra tutti i log per il servizio del server web Apache
journalctl -u httpd.service
# Mostra i log per il servizio dall'ultima volta che è stato avviato
journalctl -u nginx.service --since "start of job -1"
3. Filtraggio per ID Processo (PID) e Nome Eseguibile
Quando un processo specifico si blocca, ma non sai immediatamente quale servizio lo possiede, il filtraggio per PID o per nome dell'eseguibile (_COMM) è molto efficace.
# Mostra i log relativi a un ID processo specifico (es. PID 4589)
journalctl _PID=4589
# Mostra i log per tutti i processi denominati 'mysqld'
journalctl _COMM=mysqld
4. Filtraggio per Livello di Priorità
Alle voci del journal vengono assegnate priorità numeriche (0=emerg, 7=debug). Usa il flag -p per filtrare per gravità, il che aiuta a sopprimere l'output di debug eccessivo quando si cercano errori.
| Livello di Priorità | Parola Chiave | Valore Numerico |
|---|---|---|
| Emergency | emerg | 0 |
| Alert | alert | 1 |
| Critical | crit | 2 |
| Error | err | 3 |
| Warning | warning | 4 |
| Notice | notice | 5 |
| Info | info | 6 |
| Debug | debug | 7 |
# Mostra solo errori critici (livello 2) e superiori per il sistema
journalctl -p crit
# Mostra tutti i log tranne i messaggi di debug
journalctl -p 6
Analisi degli Errori di Avvio e dei Messaggi del Kernel
La risoluzione dei problemi di avvio del sistema richiede la separazione dei guasti dei servizi in spazio utente dai problemi di inizializzazione del kernel o dell'hardware.
Isolare i Messaggi del Kernel (-k o --dmesg)
Il flag -k mostra solo i messaggi del kernel (equivalente all'esecuzione di dmesg). Questo è cruciale per identificare problemi relativi a driver di dispositivo, riconoscimento hardware o errori di inizializzazione iniziali prima che systemd carichi i servizi.
# Rivedi tutti i messaggi del kernel dall'avvio corrente
journalctl -k
# Cerca errori hardware specifici nel log del kernel dell'avvio precedente
journalctl -k -b -1 | grep -i "error"
Tracciare le Dipendenze dei Servizi
Quando un servizio non si avvia, potrebbe essere a causa di una dipendenza a monte non riuscita. Usa la visualizzazione inversa (-r) combinata con il filtraggio per unità per vedere la sequenza che porta al guasto.
# Mostra i log per un'unità in ordine cronologico inverso
journalctl -u my-app.service -r
Formattazione Avanzata dell'Output ed Esportazione
Per un'analisi più approfondita o per condividere i log, è essenziale modificare il formato dell'output.
1. Visualizzazione come JSON (-o json)
Per scripting o integrazione con strumenti di analisi log esterni, è preferito l'output JSON strutturato.
journalctl -u sshd.service -o json
2. Visualizzazione come Singola Riga (-o cat)
Per ottenere un output pulito e grezzo senza timestamp o metadati (utile quando si invia direttamente ad altri strumenti come grep), usa il formato cat.
journalctl -u cron.service -o cat
3. Esportazione dei Log
Per archiviare o trasferire i log, esportali in un file di testo standard. Se hai bisogno di campi di metadati specifici, scegli un formato di output che includa campi strutturati.
# Esporta tutti i log dall'avvio corrente in un file di testo
journalctl -b > boot_log_$(date +%F).txt
# Esporta campi strutturati selezionati per un'unità
journalctl -u mariadb.service -o json --output-fields=__REALTIME_TIMESTAMP,PRIORITY,_PID,_COMM,MESSAGE --since today > mariadb_recent.json
Best Practice per la Gestione del Journal
La gestione delle dimensioni del Journal è cruciale per prevenire l'esaurimento dello spazio su disco, specialmente su sistemi con un volume elevato di log.
- Controlla l'Utilizzo: Determina il consumo attuale del disco del Journal:
journalctl --disk-usage - Pulisci i Log Vecchi: Limita le dimensioni del Journal per tempo o utilizzo del disco usando i comandi
vacuum:# Mantieni solo i log degli ultimi 7 giorni sudo journalctl --vacuum-time=7d # Riduci l'utilizzo del disco a un massimo di 500MB sudo journalctl --vacuum-size=500M
Usa i filtri del journal come strumento di restringimento: scegli prima l'avvio, la finestra temporale, l'unità e la priorità, poi cambia il formato dell'output solo quando devi archiviare o analizzare il risultato.