Torna al blog

journalctl cheat sheet: seguire e filtrare i log Linux

2 settembre 2026

journalctl in una riga: journalctl -u <service> -f segue il log di un servizio in diretta, journalctl -u <service> -n 100 mostra le ultime 100 righe, e journalctl --since "1 hour ago" mostra tutto ciò che è recente. Copre il 90% dei momenti «perché questo servizio non risponde». Il resto del cheat sheet sono i pattern da copiare e incollare che ti risparmiano la rilettura del man page alle 2 di notte — filtraggio per unità, tempo, priorità e boot, più i comandi di pulizia che impediscono al journal di divorarti il disco. Ogni comando qui sotto funziona così com’è su qualsiasi distro systemd (Ubuntu, Debian, Fedora, Arch).

Cos’è journalctl e perché non leggere direttamente /var/log/syslog?

Il logging alla vecchia maniera scriveva file di testo sotto /var/logsyslog, auth.log, messages. systemd ha sostituito tutto con il journal: un log binario e indicizzato gestito da systemd-journald. Un semplice grep non può leggerlo; journalctl è l’unica porta d’ingresso, e in cambio ottieni filtri per servizio, tempo, boot e severità senza acrobazie di regex.

Il modello mentale è semplice: il journal conserva tutto, e journalctl è lo strumento di interrogazione. Un servizio non ha bisogno del proprio file di log — tutto ciò che scrive su stdout/stderr mentre gira sotto systemd finisce nel journal automaticamente. Per questo journalctl -u nginx funziona anche quando non hai idea di dove nginx configuri il suo error log.

Una avvertenza: su alcune installazioni minime il journal è volatile (salvato in /run, cancellato al reboot) perché /var/log/journal non esiste. Si sistema una volta per tutte:

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal

Come vedere le ultime 100 righe di un log?

-n limita l’output alle N righe più recenti (il default è 10):

journalctl -n 100                      # le ultime 100 righe di tutto
journalctl -u nginx -n 100             # le ultime 100 righe di un'unità
journalctl -n 100 --no-pager           # stampa ed esce — perfetto per una pipe

--no-pager conta più di quanto sembri: senza, journalctl apre less e il tuo script, la tua pipe o il tuo one-liner ssh restano appesi in attesa di un tasto. Ogni comando il cui output finisce in una pipe dovrebbe portarlo.

Come seguire i log in diretta, come tail -f?

Il flag -f è il tail -f di journalctl — fa scorrere le nuove entry appena nascono:

journalctl -f                    # tutto, in diretta
journalctl -u sshd -f            # solo il demone SSH, in diretta
journalctl -u ollama -f -n 50    # in diretta, ma partendo dalle ultime 50 righe

È il comando da tenere aperto in un secondo terminale mentre riavvii un servizio nel primo: systemctl restart nginx in un pannello, journalctl -u nginx -f nell’altro, e la causa del crash di norma si annuncia da sola nel giro di pochi secondi. Io eseguo esattamente questo ciclo sul mio homelab ogni volta che un container o un servizio fa i capricci.

Come mostrare i log di un servizio specifico?

-u filtra per unità systemd:

journalctl -u nginx                    # un'unità, tutta la cronologia
journalctl -u nginx -u redis           # più unità in una volta
journalctl _SYSTEMD_UNIT=nginx.service # l'alternativa con corrispondenza esatta

Un’unità può generare unità ausiliarie che si tengono l’output interessante — un’app web che crasha a volte logga il vero errore sotto un’altra unità. Se -u <service> non restituisce nulla ma il servizio gira evidentemente, trova prima il nome vero dell’unità:

systemctl list-units --type=service | grep -i <guess>

Lo stesso pattern -u vale per i timer (systemctl list-timers mostra i nomi) e per i servizi utente — per tutto ciò che gira sotto systemd --user aggiungi --user:

journalctl --user -u pipewire -n 50

Come filtrare i log per data?

--since e --until accettano timestamp, ma anche formule relative molto permissive:

journalctl --since "1 hour ago"
journalctl --since "2026-09-01 09:00" --until "2026-09-01 12:00"
journalctl --since today
journalctl --since yesterday --until now -u cron

Abbina una finestra temporale a un’unità e hai il triage di un incidente in una riga: «cosa ha loggato l’API tra le 9:00 e il momento in cui è crollata?». Su una singola macchina è più veloce di qualsiasi log aggregator.

Come mostrare solo gli errori (o i warning)?

-p filtra per priorità, usando i nomi di severità syslog:

journalctl -p err -b              # solo errori, da questo boot
journalctl -p warning..alert -u nginx   # un intervallo di severità

Le priorità in ordine decrescente: emerg, alert, crit, err, warning, notice, info, debug. Quando una macchina «fa le bizze», journalctl -p err -b --since today è il controllo di sanità più rapido — risponde alla domanda «sta davvero fallendo qualcosa?» senza il rumore delle righe info di routine.

Come vedere i log del boot precedente?

I servizi che crashano all’avvio producono righe di log prima del boot corrente, e journalctl mostra in silenzio solo quello attuale. -b seleziona i boot:

journalctl -b                 # solo il boot corrente
journalctl -b -1              # il boot precedente
journalctl -b -1 -u sshd      # perché SSH è morto l'ultima volta
journalctl --list-boots       # l'indice dei boot salvati

È il flag più utile di tutti per lo scenario «si è rotto, ho riavviato, e ora l’errore non lo vedo più» — l’errore c’è ancora, un boot indietro.

Riferimento rapido: i flag da ricordare a memoria

ObiettivoComando
Seguire un servizio in direttajournalctl -u <svc> -f
Le ultime 100 righejournalctl -n 100
Dall’ultima orajournalctl --since "1 hour ago"
Errori di questo bootjournalctl -p err -b
Boot precedentejournalctl -b -1
Spazio disco del journaljournalctl --disk-usage
Output leggibile dalla macchinajournalctl -o json-pretty
Solo messaggi del kerneljournalctl -k

Come impedire al journal di riempire il disco?

Prima guarda quanto costa, poi metti un tetto:

journalctl --disk-usage
sudo journalctl --vacuum-size=500M     # conserva i 500 MB più recenti
sudo journalctl --vacuum-time=30d      # conserva gli ultimi 30 giorni

Per rendere il tetto permanente, metti SystemMaxUse=500M nella sezione [Journal] di /etc/systemd/journald.conf, poi sudo systemctl restart systemd-journald. Tra il tetto di dimensione e il filtro per boot qui sopra, il journal resta uno strumento invece di diventare una lenta perdita di disco.

journalctl vs dmesg vs /var/log — dove guardare per primo?

  • journalctl — il comportamento di applicazioni e servizi. Tutto ciò che systemd gestisce sta qui, indicizzato e filtrabile. La prima fermata di default.
  • journalctl -k / dmesg — kernel e hardware: kill OOM, reset USB, errori disco. Se un processo è morto senza spiegazione, cerca qui l’OOM killer prima di incolpare l’app.
  • /var/log/<app>/ — solo per le app che fanno logging su file per conto loro (access log di nginx, PostgreSQL). E anche lì, gli errori di avvio di norma finiscono comunque nel journal.

Lo stesso workflow si estende ai servizi AI in locale — quando un’unità ollama serve si blocca, journalctl -u ollama -n 100 mostra subito il fallimento del caricamento del modello, come dettagliato nel confronto tra Ollama e LM Studio.

Ecco tutto il cheat sheet: -u per l’unità, -f per seguire, -n per le righe, --since per il tempo, -p per la severità, -b per i boot. Sei flag coprono quasi ogni domanda di log che una macchina Linux ti farà.

— mrsaynothing

Get the next one by email

One email per post. No spam, no algorithms.

self-hosted · no third parties · one-click unsubscribe

what is this?

Ollama vs LM Studio: quale strumento per LLM locali?

Ti piacciono gli articoli? È così che costruisco per lavoro. assumimi