Come utilizzare il comando Systemd journalctl per gestire i log
Nonostante la pubblicità negativa, systemd ha apportato nuove fantastiche funzionalità al sistema operativo Linux. L’accesso è uno di questi. Nei giorni precedenti a systemd, il controllo dei log e dei problemi di debug a volte era una seccatura perché i log di diversi programmi erano distribuiti in file diversi e dovevi controllare i timestamp in ciascuno di essi. Ovviamente c’era anche il file syslog, ma a volte non era così prolisso come doveva essere. Systemd ci offre il demone journal chiamato journald che consente la gestione centralizzata del journal. Questi registri possono essere filtrati e manipolati dall’utilità chiamata journalctl. In questo articolo esamineremo l’utilizzo di base delle utilità.
Cos’è journal
Journald è un servizio che raccoglie e archivia i log da più fonti e crea file di log strutturati indicizzati facili da interpretare. Alcune delle fonti utilizzate da journald
- Messaggi di registro del kernel, tramite kmsg
- Semplici messaggi di syslog, tramite libc syslog chiamata
- Messaggi syslog strutturati tramite l’API Journal nativa
- Standard output e standard error dei servizi di sistema
L’idea è di centralizzare tutti i messaggi di registro, indipendentemente dall’applicazione da cui provengono.
Impostazione dell’ora
Affinché i registri siano utili, è necessario disporre dell’ora di sistema corretta. I registri possono essere UTC o ora locale. In genere, vengono salvati entrambi i timestamp. Quindi impostiamo prima il fuso orario
sudo timedatectl set-timezone Europe/Belgrade
Questo comando imposta l’ora sul fuso orario dell’Europa centrale, ma se ti trovi in qualsiasi altra parte del globo, inserisci continente e premi tab per vedere le città tra cui puoi scegliere. Non importa se non è la tua città, non vivo nemmeno a Belgrado, è solo la grande città più vicina. Successivamente, vediamo lo stato del fuso orario
miki@ThinkPad-X220T:~$ timedatectl status
Local time: Mon 2016-11-14 18:40:46 CET
Universal time: Mon 2016-11-14 17:40:46 UTC
RTC time: Mon 2016-11-14 17:40:46
Time zone: Europe/Belgrade (CET, +0100)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
1) Visualizza i registri
Ora che abbiamo l’ora corretta, continuiamo a guardare i log. Il comando di base per la visualizzazione dei registri è
journalctl
Otterrai risultati simili a questo:
-- Logs begin at Sun 2016-11-13 17:38:07 CET, end at Mon 2016-11-14 18:42:51 CET
Nov 13 17:38:07 ThinkPad-X220T systemd-journald[344]: Runtime journal (/run/log/
Nov 13 17:38:07 ThinkPad-X220T kernel: microcode: microcode updated early to rev
Questa è la prima riga, seguita da molte righe. Vediamo che i registri iniziano dall’ultimo avvio del sistema. Ieri ho riavviato il computer l’ultima volta. Per impostazione predefinita, journald non salva i log al riavvio, in quanto ciò farebbe aumentare le dimensioni dei file di log nel tempo. Il registro è simile a syslog, ma ha molte più fonti. Ho detto che vengono salvati sia i timestamp UTC che quelli locali, quindi puoi vedere gli stessi registri con timestamp UTC.
journalctl --utc
Sì, lo so che i tronchi sono enormi. Ho detto che i registri saranno di nuovo fantastici! Ma sono troppo interessanti, quindi il registro ha una funzione di filtraggio del registro ordinata.
Se vuoi vedere i log da un certo punto fino ad ora, devi usare un comando formattato in questo modo:
miki@ThinkPad-X220T:~$ journalctl --since "2016-11-14 19:15:00"
-- Logs begin at Sun 2016-11-13 17:38:07 CET, end at Mon 2016-11-14 20:07:51 CET
Nov 14 19:17:01 ThinkPad-X220T CRON[6044]: pam_unix(cron:session): session opene
Nov 14 19:17:01 ThinkPad-X220T CRON[6049]: (root) CMD ( cd / && run-parts --re
Nov 14 19:17:01 ThinkPad-X220T CRON[6044]: pam_unix(cron:session): session close
Nov 14 19:22:51 ThinkPad-X220T nm-applet[4929]: ModemManager is not available fo
...
2) Filtrare i log in base al tempo
Questo è ancora troppo grande, quindi possiamo rimpicciolirli aggiungendo un altro operando dopo –since e questo sarà –until
miki@ThinkPad-X220T:~$ journalctl --since "2016-11-14 19:00:00" --until "2016-11-14 19:05:00"
-- Logs begin at Sun 2016-11-13 17:38:07 CET, end at Mon 2016-11-14 20:21:23 CET
Nov 14 19:01:16 ThinkPad-X220T nm-applet[4929]: ModemManager is not available fo
Nov 14 19:02:51 ThinkPad-X220T nm-applet[4929]: ModemManager is not available fo
In quei cinque minuti, ci sono stati solo due massaggi ai tronchi.
I flag since e until accettano timestamp nel formato AAAA-MM-GG HH:MM:SS, ma questo non è l’unico modo. Se, ad esempio, un utente si lamenta che il tuo server è rimasto inattivo negli ultimi 5 minuti, puoi rivedere i log in questo modo:
journalctl --since "5 minutes ago"
-- Logs begin at Sun 2016-11-13 17:38:07 CET, end at Mon 2016-11-14 20:22:21 CET
Nov 14 20:21:21 ThinkPad-X220T gnome-terminal-[7867]: Allocating size to GtkBox
Nov 14 20:21:21 ThinkPad-X220T gnome-terminal-[7867]: Allocating size to GtkBox
Nov 14 20:21:23 ThinkPad-X220T gnome-terminal-[7867]: Allocating size to GtkBox
Nov 14 20:22:20 ThinkPad-X220T apport-gtk[5977]: gdk_pixbuf_composite: assertion
Nov 14 20:22:21 ThinkPad-X220T systemd[3634]: Started Notification regarding a c
Comprende anche parole come ieri o oggi, quindi puoi cercare i registri di ieri o di oggi.
3) Configurazione dell’accesso ai riavvii
Tutto ciò è più utile se si dispone di registri persistenti durante i riavvii. Se si desidera che i registri rimangano dopo l’avvio, è necessario abilitarlo manualmente. Per prima cosa crea la directory in cui verrà registrato
sudo mkdir -p /var/log/journal
Quindi modificare il file di configurazione per registrarsi in modo permanente.
sudo sed -i.orig 's/#Storage=auto/Storage=persistent/g' /etc/systemd/journald.conf
Successivamente, puoi riavviare la macchina e verificare se i caricamenti si estendono tra i riavvii con il seguente comando:
miki@ThinkPad-X220T:~$ journalctl --list-boots
-1 7917f2c3498d4de89e94701ca8049245 Mon 2016-11-14 20:47:49 CET—Mon 2016-11-14 2
0 438c0a9258aa47fcbf88daf91106aaa3 Mon 2016-11-14 20:56:55 CET—Mon 2016-11-14 2
Ho riavviato il computer due volte ed entrambi gli stivali sono registrati. Pensavo che il caricamento precedente sarebbe stato salvato, ma non lo era. Pertanto, verranno registrati solo i riavvii eseguiti dopo aver impostato i registri persistenti.
4) Gestione dei registri da diversi stivali
Se ora vuoi vedere i log solo da questo avvio, usa il comando
journalctl -b
È possibile utilizzare il numero di avvio per scegliere un avvio specifico
journalctl -b -1
Oppure potresti usare l’ID di avvio
journalctl -b 7917f2c3498d4de89e94701ca8049245
Funzionerà anche il filtraggio basato sul tempo
journalctl -b 0 --since "15 minutes ago"
5) Filtraggio per servizio e id
Diciamo che vuoi vedere i registri per un solo programma. Cercherò i registri fprintd
journalctl -u fprintd.service
-- Logs begin at Mon 2016-11-14 20:47:49 CET, end at Mon 2016-11-14 21:28:03 CET
Nov 14 20:48:32 ThinkPad-X220T systemd[1]: Starting Fingerprint Authentication D
Nov 14 20:48:32 ThinkPad-X220T systemd[1]: Started Fingerprint Authentication Da
Nov 14 20:48:32 ThinkPad-X220T fprintd[3413]: user 'miki' claiming the device: 0
Nov 14 20:48:32 ThinkPad-X220T fprintd[3413]: now monitoring fd 15
Nov 14 20:48:32 ThinkPad-X220T fprintd[3413]: device 0 claim status 0
Nov 14 20:48:33 ThinkPad-X220T fprintd[3413]: no longer monitoring fd 15
Nov 14 20:48:33 ThinkPad-X220T fprintd[3413]: released device 0
-- Reboot --
Puoi anche filtrare i log in base all’UID. Per prima cosa devi ottenere il tuo UID utente
miki@ThinkPad-X220T:~$ id -u miki
1000
E poi puoi usare quell’uid per filtrare i log
journalctl _UID=1000 --since "25 minutes ago"
Puoi anche filtrare per GID
miki@ThinkPad-X220T:~$ journalctl -F _GID
30
102
130
1000
114
118
104
126
109
0
Ora puoi filtrare in base a uno qualsiasi di questi GID
journalctl _GID=114
Filtra i log in base al percorso dell’eseguibile:
journalctl /usr/bin/sudo
Visualizza i log in tempo reale
journalctl -f
Se desideri che i tuoi registri vengano visualizzati nel testo del piano per un facile copia e incolla, puoi utilizzare l’opzione “nessuna impaginazione”
journalctl --no-pager
6) Visualizza i messaggi del kernel ed elimina i vecchi log
Journalctl può anche visualizzare i messaggi del kernel. Per impostazione predefinita, verrà visualizzato dall’avvio corrente
journalctl -k
Se vuoi i messaggi del kernel dall’avvio precedente, usa il flag -b -1.
journalctl -k -b -1
Per verificare quanto spazio su disco utilizzano i tuoi log, puoi utilizzare questo comando
journalctl --disk-usage
Archived and active journals take up 24.0M on disk.
Se i tuoi tronchi sono cresciuti di dimensioni, puoi usare un aspirapolvere per rimuovere quelli più vecchi. Beh, non proprio un aspirapolvere, ma il comando si chiama aspirapolvere.
sudo journalctl --vacuum-size=16M
Ciò ridurrà la dimensione del registro a 16 MB.
Conclusione
Ho esaminato i comandi journald di base che rendono di nuovo eccezionale la registrazione. Questo ti aiuterà molto la prossima volta che dovrai risolvere un problema persistente con il tuo server Linux o computer desktop con systemd. Systemd ci offre ottimi strumenti e la pubblicità negativa che ha ricevuto all’inizio è stata solo una reazione contro la modifica dei vecchi strumenti che anche le persone usavano. Sono già abituato a systemd e non so come ho vissuto senza di esso. Questo è tutto per questo articolo, grazie per aver letto e buona giornata.