Ricerca nel sito web

Gestisci i messaggi di registro in Systemd utilizzando Journalctl [Guida completa]


Systemd è un gestore di sistemi e servizi all'avanguardia per sistemi Linux: un sostituto del demone init destinato ad avviare processi in parallelo all'avvio del sistema. Ora è supportato in numerose distribuzioni mainstream attuali tra cui Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS, ecc.

In precedenza abbiamo spiegato la storia dietro “init” e “systemd”; dove abbiamo discusso cosa sono i due demoni, perché tecnicamente "init" doveva essere sostituito con "systemd" e anche le principali caratteristiche di systemd.

Uno dei principali vantaggi di systemd rispetto ad altri sistemi init comuni è il supporto per la gestione centralizzata della registrazione del sistema e dei processi utilizzando un journal. In questo articolo impareremo come gestire e visualizzare i messaggi di registro in systemd utilizzando il comando journalctl in Linux.

Importante: prima di proseguire in questa guida, potresti voler imparare come gestire i servizi e le unità "Systemd" utilizzando il comando "Systemctl" e anche creare ed eseguire nuovi unità di servizio in systemd utilizzando script di shell in Linux. Tuttavia, se sei d'accordo con tutto quanto sopra, continua a leggere.

Configurazione di Journald per la raccolta dei messaggi di registro in Systemd

journald è un demone che raccoglie e scrive voci di diario dall'intero sistema; si tratta essenzialmente di messaggi di avvio, messaggi dal kernel e da syslog o varie applicazioni e memorizza tutti i messaggi in una posizione centrale: file journal.

Puoi controllare il comportamento di journald tramite il suo file di configurazione predefinito: /etc/systemd/journald.conf che viene generato in fase di compilazione. Questo file contiene opzioni i cui valori possono essere modificati per adattarli ai requisiti dell'ambiente locale.

Di seguito è riportato un esempio di come appare il file, visualizzato utilizzando il comando cat.

cat /etc/systemd/journald.conf 
See journald.conf(5) for details.

[Journal]
#Storage=auto
#Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitInterval=30s
#RateLimitBurst=1000
#SystemMaxUse=
#SystemKeepFree=
#SystemMaxFileSize=
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg

Tieni presente che varie installazioni di pacchetti ed estratti di configurazione di utilizzo in /usr/lib/systemd/*.conf.d/ e configurazioni di runtime possono essere trovate in /run/systemd/journald.conf. d/*.conf che potresti non necessariamente utilizzare.

Abilita l'archiviazione dei dati del journal su disco

Un certo numero di distribuzioni Linux, incluso Ubuntu e i suoi derivati come Linux Mint, non abilitano l'archiviazione persistente dei messaggi di avvio su disco per impostazione predefinita.

È possibile abilitare ciò impostando l'opzione “Archiviazione” su “persistente” come mostrato di seguito. Questo creerà la directory /var/log/journal e tutti i file journal verranno archiviati al suo interno.

sudo vi /etc/systemd/journald.conf 
OR
sudo nano /etc/systemd/journald.conf 
[Journal]
Storage=persistent

Per impostazioni aggiuntive, trova il significato di tutte le opzioni che dovrebbero essere configurate nella sezione "[Journal]" digitando.

man journald.conf

Impostazione dell'ora di sistema corretta utilizzando il comando Timedatectl

Per una gestione affidabile dei log in systemd utilizzando il servizio journald, assicurarsi che le impostazioni dell'ora, incluso il fuso orario, siano corrette sul sistema.

Per visualizzare le impostazioni attuali di data e ora sul tuo sistema, digita.

timedatectl 
OR
timedatectl status

Local time: Thu 2017-06-15 13:29:09 EAT
Universal time: Thu 2017-06-15 10:29:09 UTC
RTC time: Thu 2017-06-15 10:29:09
Time zone: Africa/Kampala (EAT, +0300)
Network time on: yes
NTP synchronized: yes
 RTC in local TZ: no

Per impostare il fuso orario corretto ed eventualmente l'ora del sistema, utilizzare i comandi seguenti.

sudo timedatectl set-timezone  Africa/Kampala
sudo timedatectl set-time “13:50:00”

Visualizzazione dei messaggi di registro utilizzando il comando journalctl

journalctl è un'utilità utilizzata per visualizzare il contenuto del journal systemd (che è scritto dal servizio journald).

Per mostrare tutti i log raccolti senza alcun filtro, digitare.

journalctl
-- Logs begin at Wed 2017-06-14 21:56:43 EAT, end at Thu 2017-06-15 12:28:19 EAT
Jun 14 21:56:43 tecmint systemd-journald[336]: Runtime journal (/run/log/journal
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuset
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpu
Jun 14 21:56:43 tecmint kernel: Initializing cgroup subsys cpuacct
Jun 14 21:56:43 tecmint kernel: Linux version 4.4.0-21-generic (buildd@lgw01-21)
Jun 14 21:56:43 tecmint kernel: Command line: BOOT_IMAGE=/boot/vmlinuz-4.4.0-21-
Jun 14 21:56:43 tecmint kernel: KERNEL supported cpus:
Jun 14 21:56:43 tecmint kernel:   Intel GenuineIntel
Jun 14 21:56:43 tecmint kernel:   AMD AuthenticAMD
Jun 14 21:56:43 tecmint kernel:   Centaur CentaurHauls
Jun 14 21:56:43 tecmint kernel: x86/fpu: xstate_offset[2]:  576, xstate_sizes[2]
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x01: 'x87 flo
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x02: 'SSE reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Supporting XSAVE feature 0x04: 'AVX reg
Jun 14 21:56:43 tecmint kernel: x86/fpu: Enabled xstate features 0x7, context si
Jun 14 21:56:43 tecmint kernel: x86/fpu: Using 'eager' FPU context switches.
Jun 14 21:56:43 tecmint kernel: e820: BIOS-provided physical RAM map:
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000000000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000090000-0x00000000000
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000000100000-0x000000001ff
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020000000-0x00000000201
Jun 14 21:56:43 tecmint kernel: BIOS-e820: [mem 0x0000000020200000-0x00000000400

Visualizza i messaggi di registro in base agli stivali

Puoi visualizzare un elenco di numeri di avvio (relativi all'avvio corrente), i loro ID e i timestamp del primo e dell'ultimo messaggio corrispondenti all'avvio con l'opzione --list-boots.

journalctl --list-boots

-1 9fb590b48e1242f58c2579defdbbddc9 Thu 2017-06-15 16:43:36 EAT—Thu 2017-06-15 1
 0 464ae35c6e264a4ca087949936be434a Thu 2017-06-15 16:47:36 EAT—Thu 2017-06-15 1 

Per visualizzare le voci del journal dall'avvio corrente (numero 0), utilizzare l'opzione -b in questo modo (uguale all'output di esempio sopra).

journalctl -b

e per vedere un diario dell'avvio precedente, utilizzare il puntatore relativo -1 con l'opzione -b come di seguito.

journalctl -b -1

In alternativa, utilizzare l'ID di avvio in questo modo.

journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Filtraggio dei messaggi di registro in base al tempo

Per utilizzare l'ora nel formato UTC (Coordinated Universal Time), aggiungi le opzioni --utc come segue.

journalctl --utc

Per vedere tutte le voci a partire da una determinata data e ora, ad es. 15 giugno 2017 alle 8:15, digita questo comando.

journalctl --since "2017-06-15 08:15:00"
journalctl --since today
journalctl --since yesterday

Visualizzazione dei messaggi di registro recenti

Per visualizzare i messaggi di registro recenti (10 per impostazione predefinita), utilizzare il flag -n come mostrato di seguito.

journalctl -n
journalctl -n 20 

Visualizzazione dei messaggi di registro generati dal kernel

Per vedere solo i messaggi del kernel, in modo simile all'output del comando dmesg, puoi usare il flag -k.

journalctl -k 
journalctl -k -b 
journalctl -k -b 9fb590b48e1242f58c2579defdbbddc9

Visualizzazione dei messaggi di registro generati dalle unità

Per visualizzare tutte le voci del diario per una particolare unità, utilizzare l'opzione -u come segue.

journalctl -u apache2.service

Per azzerare l'avvio corrente, digitare questo comando.

journalctl -b -u apache2.service

Per mostrare i registri dell'avvio precedente, utilizzare this.

journalctl -b -1 -u apache2.service

Di seguito sono riportati alcuni altri comandi utili:

journalctl -u apache2.service  
journalctl -u apache2.service --since today
journalctl -u apache2.service -u nagios.service --since yesterday

Visualizzazione dei messaggi di registro generati dai processi

Per visualizzare i log generati da un processo specifico, specifica il suo PID in questo modo.

journalctl _PID=19487
journalctl _PID=19487 --since today
journalctl _PID=19487 --since yesterday

Visualizzazione dei messaggi di registro generati dall'ID utente o gruppo

Per visualizzare i log generati da un utente o gruppo specifico, specifica il suo ID utente o gruppo in questo modo.

journalctl _UID=1000
journalctl _UID=1000 --since today
journalctl _UID=1000 -b -1 --since today

Visualizzazione dei registri generati da un file

Per mostrare tutti i log generati da un file (possibilmente un eseguibile), come l'eseguibile D-Bus o gli eseguibili bash, è sufficiente digitare.

journalctl /usr/bin/dbus-daemon
journalctl /usr/bin/bash

Visualizzazione dei messaggi di registro per priorità

Puoi anche filtrare l'output in base alle priorità dei messaggi o agli intervalli di priorità utilizzando il flag -p. I valori possibili sono: 0 – emerg, 1 – alert, 2 – crit, 3 – err, 4 – warning, 5 – Notice, 6 – info, 7 – debug):

journalctl -p err

Per specificare un intervallo, utilizzare il formato seguente (da emergente ad avviso).

journalctl -p 1..4
OR
journalctl -p emerg..warning

Visualizza i messaggi di registro in tempo reale

Puoi praticamente osservare i log mentre vengono scritti con l'opzione -f (simile alla funzionalità tail -f).

journalctl -f

Gestione della formattazione della visualizzazione del diario

Se vuoi controllare la formattazione dell'output delle voci del diario, aggiungi il flag -o e usa queste opzioni: cat, export, json, json-pretty, json-sse, short, short-iso, breve-monotonico, breve-preciso e dettagliato (controlla il significato delle opzioni nella pagina man:

L'opzione cat mostra il messaggio effettivo di ciascuna voce del diario senza metadati (timestamp e così via).

journalctl -b -u apache2.service -o cat

Gestione dei giornali su un sistema

Per verificare la coerenza interna del file journal, utilizzare l'opzione --verify. Se tutto va bene, l'output dovrebbe indicare un PASS.

journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000003184-000551f9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000001fc8-000551f5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000d4f-000551f1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system@816533ecd00843c4a877a0a962e124f2-0000000000000001-000551f01cfcedff.journal

Eliminazione dei vecchi file del diario

Puoi anche visualizzare l'utilizzo corrente del disco di tutti i file journal con le opzioni --disk-usage. Mostra la somma dell'utilizzo del disco di tutti i file journal archiviati e attivi:

journalctl --disk-usage

Per eliminare i vecchi file journal (archiviati), eseguire i comandi seguenti:

sudo journalctl --vacuum-size=50M  #delete files until the disk space they use falls below the specified size
sudo journalctl --vacuum-time=1years	#delete files so that all journal files contain no data older than the specified timespan
sudo journalctl --vacuum-files=4     #delete files so that no more than the specified number of separate journal files remain in storage location

Rotazione dei file del diario

Ultimo ma non meno importante, puoi istruire journald a ruotare i file journal con l'opzione --rotate. Tieni presente che questa direttiva non ritorna fino al termine dell'operazione di rotazione:

sudo journalctl --rotate

Per una guida all'uso e opzioni approfondite, visualizzare la pagina man journalctl come segue.

man journalctl

Dai un'occhiata ad alcuni articoli utili.

  1. Gestione del processo e dei servizi di avvio del sistema (SysVinit, Systemd e Upstart)
  2. Petiti: uno strumento di analisi dei log open source per amministratori di sistema Linux
  3. Come impostare e gestire la rotazione dei registri utilizzando Logrotate in Linux
  4. lnav: guarda e analizza i registri Apache da un terminale Linux

Per ora è tutto. Utilizza il feedback qui sotto per porre domande o aggiungere i tuoi pensieri su questo argomento.