Analisi Avanzata dei Log per la Risoluzione dei Problemi su Linux

Utilizza journalctl, dmesg, i log di autenticazione e gli strumenti di audit per tracciare i guasti di Linux tra servizi, avvii ed eventi di sicurezza.

Analisi Avanzata dei Log per la Risoluzione dei Problemi su Linux

I log di sistema ti dicono cosa è successo prima che un servizio Linux si guastasse, un avvio si bloccasse o un server esaurisse la memoria. La parte difficile è tagliare il rumore abbastanza velocemente da trovare la riga utile.

Questa guida va oltre la semplice ispezione dei file (cat /var/log/messages) e mostra come utilizzare insieme journalctl, dmesg e i log di audit di sicurezza.


1. Padroneggiare il Giornale Unificato (systemd-journald)

Le distribuzioni Linux moderne che utilizzano systemd centralizzano la registrazione tramite systemd-journald, memorizzando i log in un formato binario strutturato e indicizzato. Lo strumento principale per accedere a questi dati è journalctl.

1.1 Filtrare per Ora e Avvio

La risoluzione avanzata dei problemi richiede spesso l'isolamento degli eventi in intervalli di tempo o cicli di avvio specifici. I flag -b (avvio) e -S/-U (da/a) sono essenziali.

Comando Scopo Caso d'Uso Esempio
journalctl -b Visualizza i log solo per l'avvio corrente. Analizzare un problema iniziato dall'ultimo riavvio.
journalctl -b -1 Visualizza i log per l'avvio precedente. Diagnosticare un guasto sporadico all'avvio.
journalctl -S "2 ore fa" Visualizza i log a partire da un'ora o durata specifica. Controllare l'attività immediatamente prima di un crash del servizio.
journalctl --since "AAAA-MM-GG HH:MM:SS" Visualizza i log a partire da un timestamp esatto. Correlare i log di sistema con dati di monitoraggio esterni.

1.2 Filtrare per Metadati

La natura strutturata del giornale consente il filtraggio basato su campi di metadati precisi, tagliando rapidamente i dati irrilevanti.

# Filtra i log specificamente per il servizio SSH
journalctl -u sshd.service

# Filtra i log dal kernel (priorità 0-7)
journalctl -k

# Filtra i log per Priorità (es., errori critici e superiori)
# 0=emerg, 1=alert, 2=crit, 3=err
journalctl -p 0..3 -S ieri

# Filtra i log per ID di processo specifico (PID)
journalctl _PID=1234

Consiglio: Giornale Persistente: Se il tuo sistema non conserva i log tra un riavvio e l'altro, abilita la registrazione persistente creando la directory del giornale: sudo mkdir -p /var/log/journal e assicurando le autorizzazioni corrette. Questo è cruciale per diagnosticare problemi relativi all'avvio.

2. Analisi dei Messaggi del Kernel con dmesg e journalctl

I messaggi del kernel sono fondamentali per diagnosticare problemi hardware di basso livello, guasti dei driver e panici del sistema operativo. Mentre dmesg fornisce un'istantanea grezza del buffer circolare del kernel, journalctl integra questi messaggi con timestamp e contesto completo.

2.1 Usare dmesg per l'Ispezione Hardware Immediata

dmesg è veloce e riflette i messaggi di inizializzazione che spesso vengono persi se il giornale non riesce ad avviarsi abbastanza presto. È utile principalmente per trovare errori di inizializzazione hardware.

# Filtra l'output di dmesg per parole chiave di guasto comuni (senza distinzione maiuscole/minuscole)
dmesg | grep -i 'fail\|error\|oops'

# Rivedi i messaggi relativi a hardware specifico (es., dischi)
dmesg | grep sd

2.2 Identificare l'OOM Killer

L'esaurimento delle risorse, in particolare la memoria, porta il kernel a invocare l'Out-Of-Memory (OOM) Killer. Questo processo termina selettivamente le applicazioni per liberare memoria. Identificare questo evento è vitale per la risoluzione dei problemi di memoria.

Cerca messaggi contenenti oom-killer o killed process nei log del kernel:

# Cerca eventi OOM nel giornale dell'avvio corrente
journalctl -b -k | grep -i 'oom-killer\|killed process'

Le voci di log associate dettaglieranno quale processo è stato terminato, la sua impronta di memoria e l'utilizzo totale della memoria del sistema in quel momento.

3. Approfondimento sui Log di Applicazioni e Servizi

Quando un servizio specifico si guasta, l'analisi dei log deve spostarsi per tracciare le dipendenze e gli errori applicativi correlati.

3.1 Correlare Stato del Servizio e Log

Inizia sempre la risoluzione dei problemi di un guasto del servizio controllandone lo stato, che spesso fornisce il codice di uscita e un indizio sull'errore.

# Controlla lo stato del servizio del server web
systemctl status apache2.service

# Segui immediatamente visualizzando i log del servizio
journalctl -u apache2.service --no-pager

Cerca codici di uscita diversi da zero, segmentation fault o messaggi che indicano una violazione del limite di risorse (es., limiti dei descrittori di file).

3.2 Esaminare i File di Log Tradizionali

Mentre systemd gestisce la maggior parte dei log, alcune applicazioni o servizi legacy (specialmente database come PostgreSQL o MySQL) scrivono ancora voluminosi log direttamente in /var/log.

Posizioni comuni e loro scopi:

  • /var/log/messages o /var/log/syslog: Attività generale del sistema, a seconda della distribuzione.
  • /var/log/dmesg: Copia statica del buffer circolare del kernel (se salvata).
  • /var/log/httpd/error_log: Errori applicativi specifici di Apache/Nginx.
  • /var/log/faillog: Registra i tentativi di accesso falliti.

Usa potenti strumenti di manipolazione del testo come grep, awk e tail per il monitoraggio in tempo reale e il filtraggio di questi file:

# Osserva un file di log in tempo reale mentre riproduci un errore
tail -f /var/log/application/database.log | grep -i 'fatal\|timeout'

4. Analisi dei Log di Sicurezza e Audit

I log di sicurezza forniscono visibilità sui tentativi di autenticazione, i fallimenti di autorizzazione e le modifiche alla configurazione, fondamentali per diagnosticare problemi di controllo degli accessi o tentativi di intrusione.

4.1 Log di Autenticazione (auth.log/secure)

Su Debian/Ubuntu, questi log risiedono in /var/log/auth.log; su RHEL/CentOS, si trovano tipicamente in /var/log/secure (o interrogabili tramite il giornale).

Cerca ripetuti fallimenti di connessione o tentativi non autorizzati, spesso segnalati da:

# Visualizzare i tentativi di accesso SSH falliti
grep 'Failed password' /var/log/secure

# Analizzare l'uso di sudo per escalation di privilegi non autorizzata
grep 'COMMAND=' /var/log/auth.log

4.2 Sistema di Audit Linux (Auditd)

Per ambienti che richiedono un tracciamento completo dell'accesso ai file, delle chiamate di sistema e delle modifiche alla configurazione, il Sistema di Audit Linux (auditd) è essenziale. L'analisi viene tipicamente eseguita utilizzando lo strumento ausearch.

# Cerca eventi relativi a negazioni di accesso ai file
ausearch -m AVC,USER_AVC,DENIED -ts ieri

# Cerca tutte le chiamate di sistema eseguite da un utente specifico (UID 1000)
ausearch -ua 1000

5. Scenari Pratici di Risoluzione dei Problemi

Un'analisi efficace dei log implica sapere dove guardare in base al sintomo osservato.

Scenario 1: Fallimento del Montaggio del Filesystem Durante l'Avvio

Se il sistema si avvia in modalità di emergenza, il problema è quasi sempre rintracciabile nei messaggi di avvio iniziali.

  1. Azione: Riavvia il sistema.
  2. Strumento di Analisi: journalctl -b -k (concentrati sui log del kernel per l'avvio fallito).
  3. Parole Chiave: ext4 error, superblock, mount error, dependency failed.
  4. Indizio della Causa Radice: Una riga che menziona un codice di errore esplicito su /dev/sdb1 o un UUID mancante in /etc/fstab.

Scenario 2: Carico Elevato Sporadico e Rallentamento del Servizio

Quando le prestazioni si degradano in modo intermittente, la causa potrebbe essere la contesa delle risorse o una perdita di memoria.

  1. Azione: Determina l'ora in cui si è verificato il rallentamento.
  2. Strumento di Analisi: journalctl --since "10 minuti prima dell'evento" -p warning..crit.
  3. Parole Chiave: oom-killer, cgroup limit, CPU limit reached, deadlock.
  4. Indizio della Causa Radice: Se non viene trovato alcun OOM killer, filtra i log per singoli servizi ad alta intensità di risorse per verificare la presenza di errori interni ripetuti (es., timeout di connessione al database o registrazione eccessiva).

Conclusione: Costruisci un Flusso di Lavoro Ripetibile per i Log

L'analisi avanzata dei log funziona meglio quando segui lo stesso percorso ogni volta:

  1. Standardizza il Filtraggio: Impara e standardizza i tuoi comandi journalctl per isolare rapidamente avvii, servizi e intervalli di tempo.
  2. Centralizza la Registrazione: Implementa una soluzione di registrazione centralizzata (es., ELK Stack, Splunk, Graylog) per ambienti complessi. Ciò consente la correlazione dei log su più server, fondamentale per la risoluzione dei problemi delle applicazioni distribuite.
  3. Comprendi le Priorità: Conosci i livelli di gravità (emerg, alert, crit, err, warning, notice, info, debug) e utilizza il flag -p per ignorare i messaggi di info di routine durante le emergenze.
  4. Mantieni la Sincronizzazione: Assicurati che tutti gli orologi di sistema siano sincronizzati tramite NTP; orologi non sincronizzati rendono quasi impossibile la correlazione dei log tra sistemi.