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) che journalctl utilizza 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.