Jour­nalc­tl è uno strumento versatile per gestire e ana­liz­za­re in modo efficace i registri di sistema su Linux. Grazie alle sue funzioni avanzate consente il mo­ni­to­rag­gio delle attività di sistema, l’analisi dei problemi, il trac­cia­men­to dei registri in tempo reale e la visione det­ta­glia­ta dei dati di registro. In poche parole: è uti­lis­si­mo per dia­gno­sti­ca­re con efficacia i problemi di sistema.

Cos’è Jour­nalc­tl?

Jour­nalc­tl è un potente strumento in grado di in­ter­ro­ga­re e vi­sua­liz­za­re i registri ovvero i file di log su Linux. Parte in­te­gran­te della suite di strumenti systemd per la gestione dei sistemi e dei servizi, viene usato per im­po­sta­zio­ne pre­de­fi­ni­ta in numerose di­stri­bu­zio­ni Linux moderne, tra cui Ubuntu, Fedora e Arch Linux. Il nome “jour­nalc­tl” è composto dai termini “journal” (registro) e “ctl” (control) e fa ri­fe­ri­men­to alla sua funzione di strumento di controllo e di analisi dei registri.

Jour­nalc­tl consente l’accesso al registro di sistema, gestito da systemd-journald. Il registro di sistema è una lista cen­tra­liz­za­ta di messaggi ed eventi che si producono durante il fun­zio­na­men­to del sistema. A dif­fe­ren­za del classico log di testo, Jour­nalc­tl consente di eseguire la ricerca, il fil­trag­gio e la vi­sua­liz­za­zio­ne in tempo reale dei dati di registro. Queste azioni possono tornare utili per dia­gno­sti­ca­re problemi o mo­ni­to­ra­re lo stato del sistema.

Jour­nalc­tl salva i file di log in formato binario perché sono più compatti e fun­zio­na­no meglio rispetto ai file di testo. Con­si­de­ran­do la grande quantità di dati contenuti nei registri, in questo modo i file possono essere filtrati più ra­pi­da­men­te ed ef­fi­ca­ce­men­te secondo criteri specifici. Inoltre, i file di log binari sono più sicuri perché crit­to­gra­fa­ti e quindi più difficili da ma­ni­po­la­re rispetto ai log di testo.

Impostare lo spazio occupato su disco dai file di log

Grazie alle im­po­sta­zio­ni del servizio systemd-journald, Jour­nalc­tl consente di gestire e con­fi­gu­ra­re lo spazio di ar­chi­via­zio­ne occupato dai file di log sul disco rigido. Queste con­fi­gu­ra­zio­ni sono me­mo­riz­za­te nel file /etc/systemd/journald.conf dove sono incluse le seguenti voci:

  • SystemMaxUse: limita lo spazio di ar­chi­via­zio­ne dei registri nella directory di sistema.
  • RuntimeMaxUse: limita lo spazio di ar­chi­via­zio­ne dei registri nella directory tem­po­ra­nea.

Per impostare i limiti di ar­chi­via­zio­ne è possibile ag­giun­ge­re o mo­di­fi­ca­re le seguenti righe nel file in base alle proprie esigenze:

[Journal]
SystemMaxUse=50M
RuntimeMaxUse=50M
bash

I valori di questo esempio, come 50M, possono essere mo­di­fi­ca­ti a piacere. È possibile usare anche unità diverse, come K (kilobyte), M (megabyte), G (gigabyte) o T (terabyte). Dopo aver mo­di­fi­ca­to il file di con­fi­gu­ra­zio­ne è ne­ces­sa­rio riavviare il systemd-journald:

sudo systemctl restart systemd-journald
bash

Ora systemd-journald è con­fi­gu­ra­to in modo tale da limitare lo spazio di ar­chi­via­zio­ne dei file di log. È ne­ces­sa­rio as­si­cu­rar­si che il limite stabilito sia suf­fi­cien­te per salvare i file di log più im­por­tan­ti, ma che allo stesso tempo consenta di evitare di occupare troppo spazio sul disco rigido. Fai at­ten­zio­ne: quando si raggiunge il limite, i registri più vecchi vengono au­to­ma­ti­ca­men­te can­cel­la­ti per garantire la gestione efficace dello spazio di ar­chi­via­zio­ne.

De­ter­mi­na­re lo spazio occupato su disco

Prima di adattare lo spazio di­spo­ni­bi­le per i file di registro puoi ve­ri­fi­ca­re quanto spazio viene occupato da Journal. Per farlo puoi usare il flag --disk-usage:

journalctl --disk-usage
Journals take up 8.0M on disk.
bash

Can­cel­la­re tutti i file di log

Se Journal occupa troppo spazio è sem­pli­ce­men­te possibile can­cel­la­re i vecchi file di log. A questo proposito ci sono due pos­si­bi­li­tà:

Con --vacuum-size è possibile ridurre le di­men­sio­ni di Journal spe­ci­fi­can­do una quantità. In questo caso si eliminano i vecchi log, finché lo spazio totale occupato da Journal sul disco assume le di­men­sio­ni de­si­de­ra­te.

sudo journalctl --vacuum-size=1G
bash

In al­ter­na­ti­va, con l’opzione --vacuum-time è possibile diminuire le di­men­sio­ni di Journal spe­ci­fi­can­do un periodo di blocco. In questo modo, tutti i file che sforano questo lasso di tempo vengono eliminati. Se ad esempio desideri con­ser­va­re solo i file di log dell’ultimo anno, puoi digitare il seguente comando:

sudo journalctl --vacuum-time=1years
bash

Cos’è Jour­nalc­tl?

Una delle funzioni più utili di Jour­nalc­tl è la pos­si­bi­li­tà di filtrare le voci di log in base a vari criteri. Questa funzione consente di cercare le in­for­ma­zio­ni rilevanti in modo mirato e quindi di iden­ti­fi­ca­re più ra­pi­da­men­te eventuali problemi. Di seguito pre­sen­tia­mo alcuni dei filtri più comuni di Jour­nalc­tl.

Vi­sua­liz­za­re i registri

Digitando il comando journalctl, le voci di registro del sistema attuale sono vi­sua­liz­za­te in ordine cro­no­lo­gi­co inverso. Digitando journalctl -f o journalctl --follow, le voci sono vi­sua­liz­za­te in tempo reale. Le nuove voci sono vi­sua­liz­za­te au­to­ma­ti­ca­men­te nell’ordine in cui vengono salvate.

A seconda da quanto tempo systemd è già presente sul tuo sistema, la quantità di dati vi­sua­liz­za­ta ti potrebbe sembrare più o meno infinita e potrebbe situarsi nell’ordine di decine o centinaia di migliaia di righe. Per trovare più ve­lo­ce­men­te quello che stai cercando, puoi filtrare ul­te­rior­men­te i registri mediante diversi comandi Linux.

Filtri temporali

Con Jour­nalc­tl è possibile filtrare i registri dopo un de­ter­mi­na­to periodo di tempo per poter così trovare in­for­ma­zio­ni rilevanti in modo più efficace.

Filtrare per processi di avvio

Filtrare i registri in base ai processi di avvio risulta par­ti­co­lar­men­te utile per mo­ni­to­ra­re eventi specifici del sistema in un de­ter­mi­na­to momento o durante uno specifico scenario di avvio. Questo approccio sem­pli­fi­ca la diagnosi dei problemi in quanto le voci di registro possono essere limitate a uno stato o a una con­fi­gu­ra­zio­ne specifica del sistema.

  1. Sessione di avvio attuale: digitando journalctl -b è possibile vi­sua­liz­za­re tutte le voci di registro raccolte a partire dall’ultimo riavvio.
  2. Sessioni di avvio passate: digitando -b seguito da un numero è possibile vi­sua­liz­za­re tutte le voci per una sessione di avvio passata. Ad esempio, spe­ci­fi­can­do journalctl -b 1 viene vi­sua­liz­za­ta la sessione di avvio pre­ce­den­te.
  3. Lista di tutte le sessioni di avvio di­spo­ni­bi­li: digitando il comando journalctl --list-boots viene vi­sua­liz­za­to un elenco dei processi di avvio di­spo­ni­bi­li con i ri­spet­ti­vi ID. Per vi­sua­liz­za­re i registri di un processo di avvio specifico è possibile uti­liz­za­re il relativo ID di avvio.

Mentre su alcune di­stri­bu­zio­ni Linux i processi di avvio passati vengono salvati per im­po­sta­zio­ne pre­de­fi­ni­ta, su altre questa funzione deve essere ap­po­si­ta­men­te attivata. Per farlo, è possibile creare una directory in cui salvare il registro digitando sudo mkdir -p /var/log/journal.

In al­ter­na­ti­va, è possibile mo­di­fi­ca­re il file di con­fi­gu­ra­zio­ne di Journal mediante il comando sudo nano /etc/systemd/journald.conf. Quindi, per abilitare la re­gi­stra­zio­ne per­si­sten­te è ne­ces­sa­rio impostare l’opzione Storage= su persistent alla voce [Journal]:

. . .
[Journal]
Storage=persistent
bash

Filtrare per finestre di tempo

A volte può essere ne­ces­sa­rio vi­sua­liz­za­re le voci di registro fil­tran­do­le secondo un periodo di tempo specifico. Jour­nalc­tl offre le opzioni --since e --until, che servono a de­li­mi­ta­re le voci secondo uno specifico periodo di tempo. A questo proposito è possibile uti­liz­za­re il formato temporale YYYY-MM-DD HH:MM:SS. Ad esempio, se si desidera vi­sua­liz­za­re tutte le voci di registro tra il 1° gennaio 2024 alle 12:00 e il 2 gennaio 2024 alle 12:00, è possibile digitare il seguente comando:

journalctl --since "2024-01-01 12:00:00" --until "2024-01-02 12:00:00"
bash

Con la com­bi­na­zio­ne di questi due comandi è anche possibile impostare una finestra di tempo più limitata:

journalctl --since 09:00 --until "1 hour ago"
bash

In al­ter­na­ti­va c’è la pos­si­bi­li­tà di omettere parti della formula pre­ce­den­te. Ad esempio, è possibile vi­sua­liz­za­re tutte le voci a partire da un de­ter­mi­na­to periodo di tempo:

journalctl --since "2023-11-16 15:25:00"
bash

Jour­nalc­tl è in grado di com­pren­de­re anche valori relativi come yesterday (ieri), today (oggi) o tomorrow (domani). Per poter vi­sua­liz­za­re le voci di ieri, puoi digitare il seguente comando:

journalctl --since yesterday
bash

Filtri per interesse

Filtrare le voci di registro con jour­nalc­tl in base a criteri di interesse è par­ti­co­lar­men­te utile perché consente di in­di­vi­dua­re in­for­ma­zio­ni rilevanti con­cen­tran­do­si su aspetti specifici dei registri di sistema. Questo facilita, tra l’altro, la rapida diagnosi di errori con­sen­ten­do di in­di­vi­dua­re tem­pe­sti­va­men­te problemi di sicurezza e di mo­ni­to­ra­re le pre­sta­zio­ni in modo rapido ed efficace.

Filtrare per priorità

Per filtrare i registri con Jour­nalc­tl in base a specifici criteri di interesse è possibile sfruttare le priorità delle voci di registro. A tal proposito, è suf­fi­cien­te uti­liz­za­re il nome della ri­spet­ti­va priorità o il cor­ri­spon­den­te valore numerico. Più basso è il numero, più im­por­tan­te è il messaggio:

  • 0: emerg (emergenza)
  • 1: alert (allarme)
  • 2: crit (criticità)
  • 3: err (errore)
  • 4: warning (av­ver­ten­za)
  • 5: notice (notifica)
  • 6: info (in­for­ma­zio­ne)
  • 7: debug (ricerca di errore)

Gli avvisi con una de­ter­mi­na­ta priorità possono essere filtrati mediante l’opzione -p. Ad esempio, usando il comando sot­to­stan­te si vi­sua­liz­za­no solo voci di pro­to­col­lo con la priorità “err” (errore) e superiori:

journalctl -p err
bash

Filtrare per unità

Con Jour­nalc­tl, filtrare i registri per unità ti può tornare par­ti­co­lar­men­te utile se desideri con­cen­trar­ti su specifici servizi o processi. Questi possono essere in­di­vi­dua­ti mediante l’opzione -u. Ad esempio, se desideri vi­sua­liz­za­re le voci di pro­to­col­lo per il server web Apache, puoi digitare quanto segue:

journalctl -u apache2
bash

È possibile raffinare ul­te­rior­men­te la ricerca mediante dei valori temporali relativi. Ad esempio, se desideri sapere se oggi il servizio è già stato avviato, puoi digitare il seguente comando:

journalctl -u apache2 --since today
bash

Jour­nalc­tl può essere uti­liz­za­to anche per unire record di dati pro­ve­nien­ti da unità diverse. Ad esempio, se il processo Nginx è collegato a un’unità PHP FPM, le voci di entrambe possono essere combinate in ordine cro­no­lo­gi­co. In questo caso si usa il comando:

journalctl -u nginx.service -u php-fpm.service --since today-u apache2 --since today
bash

Filtrare per processi, utenti o ID di gruppo

Con Jour­nalc­tl è possibile filtrare le voci di pro­to­col­lo in base al processo, all’utente o all’ID di gruppo. Se conosci il PID specifico del processo da cercare, puoi filtrarlo mediante l’opzione _PID. Se, ad esempio, il PID cor­ri­spon­de a 8088, il comando sarà:

journalctl _PID=8088
bash

In al­ter­na­ti­va, con i filtri _UID o _GID è possibile vi­sua­liz­za­re tutte le voci re­gi­stra­te da un de­ter­mi­na­to utente o gruppo. Se, ad esempio, il server web si chiama “www-data”, è possibile in­di­vi­dua­re l’ID utente come segue:

id -u www-data
33
bash

Ora che conosci l’ID, puoi filtrare le voci di Journal:

journalctl _UID=33 --since today
bash

Per vedere per quali voci sono state rea­liz­za­te all’interno di un de­ter­mi­na­to ID di gruppo, è possibile usare l’opzione -F. Questo mostra tutti i valori salvati per il campo “ID di gruppo”:

journalctl -F _GID
32
99
102
133
81
84
100
0
124
87
bash

Filtrare per campi com­po­nen­te

Il filtro basato sul campo com­po­nen­te è estre­ma­men­te utile quando esa­mi­nia­mo ap­pli­ca­zio­ni, servizi o processi specifici. Il campo com­po­nen­te viene nor­mal­men­te uti­liz­za­to da diversi servizi o com­po­nen­ti software per iden­ti­fi­ca­re in­for­ma­zio­ni spe­ci­fi­che nei log. Questo tipo di filtro consente di limitare le voci di registro a un com­po­nen­te, un’ap­pli­ca­zio­ne o un’unità di servizio specifici. Ad esempio, per filtrare le voci che con­ten­go­no il file ese­gui­bi­le bash, è suf­fi­cien­te digitare il seguente comando:

journalctl /usr/bin/bash
bash

Vi­sua­liz­za­re i messaggi del kernel

Con Jour­nalc­tl, filtrare le voci di registro in base ai messaggi del kernel è un modo efficace per ottenere in­for­ma­zio­ni spe­ci­fi­che sul fun­zio­na­men­to del kernel nei sistemi Linux. I messaggi del kernel possono offrire in­di­ca­zio­ni su problemi hardware, conflitti di driver o altri eventi di sistema.

I messaggi del kernel presenti nell’output dmesg possono essere filtrati anche dal Journal e vi­sua­liz­za­ti uti­liz­zan­do i flag -k o --dmesg:

journalctl -k
bash

Per im­po­sta­zio­ne pre­de­fi­ni­ta vengono vi­sua­liz­za­ti i messaggi del kernel relativi al processo di avvio corrente. È possibile filtrare i messaggi di un altro processo di avvio ser­ven­do­si dei flag di selezione dell’avvio già noti. Ad esempio, se si desidera vi­sua­liz­za­re i messaggi del kernel degli ultimi cinque processi di avvio, basta digitare quanto segue:

journalctl -k -b -5
bash

Per­so­na­liz­za­re la vi­sua­liz­za­zio­ne in Jour­nalc­tl

Mo­di­fi­can­do la vi­sua­liz­za­zio­ne in Jour­nalc­tl, gli utenti possono eseguire ricerche all’interno dei registri in modo più mirato, estraendo così più ra­pi­da­men­te le in­for­ma­zio­ni di cui hanno bisogno. Un esempio: vi­sua­liz­za­re i dati di registro in un periodo di tempo specifico o in tempo reale consente di ri­co­no­sce­re ra­pi­da­men­te gli errori e i problemi del sistema.

De­li­mi­ta­re o ampliare l’output

È possibile per­so­na­liz­za­re il modo in cui i dati vengono vi­sua­liz­za­ti in Jour­nalc­tl, mo­di­fi­can­do­ne la lunghezza o l’esten­sio­ne dell’output. Per im­po­sta­zio­ne pre­de­fi­ni­ta, Jour­nalc­tl vi­sua­liz­za l’intero file nel pager e scorre le voci sul lato destro dello schermo. È possibile ac­cor­cia­re l’output mediante l’opzione --no-full:

journalctl --no-full
bash

In al­ter­na­ti­va è possibile espan­der­lo mediante il flag -a:

journalctl -a
bash

Impostare Jour­nalc­tl su output standard

In Jour­nalc­tl, l’output del log viene vi­sua­liz­za­to per im­po­sta­zio­ne pre­de­fi­ni­ta uti­liz­zan­do un pager, ad esempio less. Il vantaggio di questo metodo è che l’output può essere esaminato riga per riga, sem­pli­fi­can­do la na­vi­ga­zio­ne nei file di log molto lunghi. Tuttavia, a volte può essere ne­ces­sa­rio vi­sua­liz­za­re i log di­ret­ta­men­te con l’output standard. Per farlo basta digitare il seguente comando:

journalctl --no-pager
bash

Impostare i formati di output

Se ne­ces­sa­rio, esistono numerose opzioni per per­so­na­liz­za­re il formato di output dei log in Jour­nalc­tl. A questo scopo è possibile usare l’opzione -o con il ri­spet­ti­vo iden­ti­fi­ca­to­re di formato. In questo modo, le voci di registro possono essere emesse, ad esempio, in formato JSON:

journalctl -b -u nginx -o json
{ "__CURSOR" : “s=13a21661cf4948289c63075db6c25c00;i=116f1;b=81b58db8fd9046ab9f847ddb82a2fa2d;m=19f0daa;t=50e33c33587ae;x=e307daadb4858635", "__REALTIME_TIMESTAMP" : "1422990364739502", "__MONOTONIC_TIMESTAMP" : "27200938", "_BOOT_ID" : "81b58db8fd9046ab9f847ddb82a2fa2d", "PRIORITY" : “6", "_UID" : “0", "_GID" : “0", "_CAP_EFFECTIVE" : "3fffffffff", "_MACHINE_ID" : “752737531a9d1a9c1e3cb52a4ab967ee", "_HOSTNAME" : "desktop", "SYSLOG_FACILITY" : “3", "CODE_FILE" : “src/core/unit.c", "CODE_LINE" : "1402", "CODE_FUNCTION" :
bash

In Jour­nalc­tl possono essere usati i seguenti formati:

  • cat: vi­sua­liz­za solo il campo messaggio.
  • export: questo formato binario è adatto a spostare o salvare dati.
  • json: formato JSON standard con una voce per riga.
  • json-pretty: consente una maggiore leg­gi­bi­li­tà dei file JSON for­mat­ta­ti.
  • json-sse: output JSON for­mat­ta­to che consente di ag­giun­ge­re eventi inviati dal server.
  • short: output standard in stile syslog.
  • short-iso: formato standard per vi­sua­liz­za­re una marca temporale dell’orologio ISO-8601
  • short-monotonic: formato standard con marche temporali monotone
  • short-precise: formato standard con pre­ci­sio­ne al mil­li­se­con­do
  • verbose: vi­sua­liz­za il campo Journal di­spo­ni­bi­le per ciascuna voce

Mo­ni­to­rag­gio attivo dei processi

Nel mo­ni­to­rag­gio attivo dei processi con Jour­nalc­tl si usa il programma a riga di comando tail, per seguire i registri in tempo reale e vi­sua­liz­za­re solo le ultime voci. Questo sem­pli­fi­ca il mo­ni­to­rag­gio degli eventi di sistema in tempo reale e consente di reagire ra­pi­da­men­te a eventuali problemi.

Vi­sua­liz­za­zio­ne di pro­to­col­li attuali

L’opzione -n può essere usata per vi­sua­liz­za­re un de­ter­mi­na­to numero di record di dati. Questa opzione funziona esat­ta­men­te come tail -n. Il seguente comando consente di vi­sua­liz­za­re le ultime 10 voci:

journalctl -n
bash

Il numero di voci da vi­sua­liz­za­re può essere impostato in­di­vi­dual­men­te, ad esempio a 20:

journalctl -n 20
bash
Server dedicati
Per­for­man­ce e in­no­va­zio­ne
  • Pro­ces­so­ri al­l'a­van­guar­dia di ultima ge­ne­ra­zio­ne
  • Hardware dedicato ad alte pre­sta­zio­ni
  • Data center cer­ti­fi­ca­ti ISO
Vai al menu prin­ci­pa­le