Demistificare journalctl: La tua guida ai log di sistema Linux

Padroneggia l'utility `journalctl` di systemd per visualizzare, filtrare e analizzare efficacemente i log di sistema Linux. Questa guida copre i comandi essenziali per il monitoraggio in tempo reale, l'interrogazione basata sul tempo, l'isolamento dei log delle unità di servizio e la gestione dell'utilizzo del disco del journal per una potente risoluzione dei problemi.

35 visualizzazioni

Demistificare journalctl: La tua guida ai log di sistema Linux

L'utility journalctl è il comando centrale per visualizzare e analizzare i log strutturati gestiti dal sistema di journaling di systemd. Essendo lo standard moderno per il logging su molte distribuzioni Linux, comprendere journalctl è cruciale per un'amministrazione efficace del sistema, la gestione dei servizi e, soprattutto, la risoluzione dei problemi.

A differenza dei tradizionali file di log basati su testo (come quelli trovati in /var/log), systemd acquisisce i log in un formato binario indicizzato. Questo consente potenti interrogazioni basate su tempo, servizio, ID di avvio e altro ancora. Questa guida ti accompagnerà attraverso i comandi essenziali necessari per sbloccare il pieno potenziale degli eventi storici e in tempo reale del tuo sistema.


Comprendere il Journal di Systemd

Prima di addentrarci nei comandi, è utile sapere cosa gestisce journalctl. Il journal di systemd raccoglie i log dal kernel, dai servizi (unità), dalle applicazioni e persino dal processo di avvio del sistema. Questi log sono tipicamente memorizzati in file binari strutturati, rendendoli molto più veloci da cercare e filtrare rispetto ai tradizionali file piatti.

Concetti Chiave:

  • Persistenza: I log possono essere configurati per essere memorizzati permanentemente tra i riavvii (modalità persistente) o solo conservati in memoria (modalità volatile).
  • Dati Strutturati: I log contengono metadati (come nome dell'unità, priorità, ID di avvio) che journalctl sfrutta per il filtraggio.

Comandi Essenziali di Visualizzazione

La necessità più comune è semplicemente visualizzare i log. Ecco i comandi fondamentali per iniziare a esplorare la cronologia del tuo sistema.

1. Visualizzare Tutti i Log

Per vedere ogni voce raccolta dal journal da quando il sistema ha iniziato a registrare i log, usa il comando senza argomenti:

journalctl

Per impostazione predefinita, questo output viene paginato utilizzando uno strumento come less, permettendoti di navigare su e giù usando i tasti freccia o la barra spaziatrice.

2. Visualizzare i Log in Tempo Reale (Seguendo)

Simile all'uso di tail -f, puoi monitorare i log mentre vengono scritti nel journal. Questo è inestimabile quando si avvia o si esegue il debug di un servizio specifico:

journalctl -f

Per uscire dalla visualizzazione in tempo reale, premi Ctrl+C.

3. Limitare l'Output per Numero di Righe

Se hai bisogno solo delle voci più recenti, usa il flag -n per specificare il numero di righe:

# Mostra le ultime 20 voci di log
journalctl -n 20

4. Visualizzare i Log da un'Ora Specifica

Il filtraggio per ora è una delle funzionalità più potenti di journalctl. Puoi usare timestamp relativi o assoluti.

Esempi di Tempo Relativo:

Comando Descrizione
journalctl --since "1 hour ago" Log dell'ultima ora.
journalctl --since "yesterday" Log dall'inizio del giorno solare precedente.
journalctl --since "2023-10-26 14:30:00" Log dopo una data e ora specifiche.

Suggerimento: Puoi combinare --since e --until per specificare un intervallo preciso, ad esempio: journalctl --since "2023-10-26" --until "2023-10-27 00:00:00".


Filtraggio dei Log per Unità, Servizio o Processo

Uno degli usi più critici di journalctl è isolare i messaggi relativi a una specifica unità systemd (servizio).

Filtraggio per Nome Servizio

Usa il flag -u (o --unit) seguito dal nome del servizio (ad esempio, sshd.service, nginx.service):

# Visualizza solo i log per il servizio server web Apache
journalctl -u apache2.service

# Segui i log per il servizio Docker
journalctl -u docker.service -f

Filtraggio per ID di Avvio

Systemd tiene traccia dei log attraverso diversi avvii di sistema. Per vedere i log da un avvio precedente, elenca prima gli avvii disponibili:

journalctl --list-boots

Questo produce un elenco indicizzato (ad esempio, -1, -2, 0 per l'avvio corrente). Puoi quindi utilizzare l'indice o l'ID di avvio completo:

# Mostra i log dall'avvio immediatamente precedente
journalctl -b -1

# Mostra i log da un ID di avvio specifico (usa l'ID lungo elencato sopra)
journalctl -b a1b2c3d4e5f6...

Filtraggio per Messaggi del Kernel

Per visualizzare solo i messaggi provenienti dal kernel (simile all'uso di dmesg):

journalctl -k
# O, equivalentemente:
journalctl -b -k

Filtraggio Avanzato e Controllo dell'Output

Un'efficace risoluzione dei problemi spesso richiede la combinazione di filtri e il controllo del formato di output.

1. Filtraggio per Livello di Priorità

Ai log vengono assegnati livelli di priorità (0=emerg, 7=debug). Puoi usare il flag -p (o --priority) per visualizzare messaggi di gravità pari o superiore:

Livello di Priorità Valore Numerico
err (Errore) 3
warning 4
notice 5
info 6
# Mostra tutti gli errori, i messaggi critici ed di emergenza dal servizio SSH
journalctl -u sshd.service -p err

2. Ricerca di Testo Specifico

Quando il filtraggio standard non è sufficiente, puoi reindirizzare l'output a grep, anche se journalctl ha un meccanismo integrato per la ricerca di testo, che è spesso più efficiente per i dati strutturati:

# Cerca in tutti i log le righe contenenti la parola 'failed'
journalctl | grep failed

# Oppure, usa l'opzione --grep per un filtraggio più semplice (se disponibile/preferito)
journalctl --grep=failed

3. Modifica del Formato di Output

Per lo scripting o per spostare i log in altri strumenti, modificare il formato di output è essenziale. L'impostazione predefinita è pretty (leggibile dall'uomo).

  • --output=json: Produce voci come oggetti JSON strutturati.
  • --output=short: Simile a pretty ma meno colorato.
  • --output=export: Produce voci di journal grezze per l'archiviazione.
# Produce gli ultimi log in formato JSON
journalctl -n 5 --output=json

4. Combinazione di Filtri

I filtri si accumulano moltiplicativamente. Per vedere tutti gli errori di Nginx registrati negli ultimi 10 minuti:

journalctl -u nginx.service --since "10 minutes ago" -p err

Gestione delle Dimensioni e Persistenza del Journal

Nel tempo, il journal può consumare una quantità significativa di spazio su disco, specialmente se configurato per il logging persistente. Gli amministratori di sistema devono gestirne le dimensioni.

Verifica dell'Utilizzo Attuale

Per vedere quanto spazio su disco occupano i file di journal attuali:

journalctl --disk-usage

Pulizia dei Log Vecchi

Puoi eliminare i log in base al tempo o alla dimensione totale.

Pulizia per Tempo:

# Conserva solo i log degli ultimi 7 giorni
journalctl --vacuum-time=7d

Pulizia per Dimensione:

# Riduci la dimensione totale dei log a un massimo di 500 Megabyte
journalctl --vacuum-size=500M

Avviso: Prestare attenzione durante l'eliminazione dei log, in particolare quelli da avvii precedenti (-b). Assicurarsi che le informazioni diagnostiche critiche non vengano rimosse prematuramente.

Conclusione

journalctl è uno strumento potente e flessibile che porta il logging oltre i semplici file di testo. Padroneggiando il filtraggio basato sul tempo (--since, --until), l'isolamento delle unità (-u) e il monitoraggio in tempo reale (-f), si ottiene un controllo granulare sul monitoraggio dello stato del sistema. Sia che tu stia controllando lo stato di un servizio o analizzando un kernel panic della settimana scorsa, journalctl è la tua interfaccia principale al moderno journal di sistema Linux.