Master Journalctl Comprendi i registri di sistema

Master Journalctl Comprendi i registri di sistema
SystemD è il nuovo strumento di gestione dei servizi. Creato inizialmente da Red Hat, consente di gestire meglio i servizi tramite un processo centralizzato che monitora e lancia i servizi secondo necessità. Ma SystemD include anche un sistema di container, un sistema Cron, un modo per fornire directory temporanei ai servizi in modo sicuro e anche un sistema di registrazione - è lì che ci concentreremo qui.

Comprendere i registri è importante: se cadi mai su un server che ha un bug o viene violato, generalmente il tuo unico modo per capire cosa è successo è tramite i registri. L'applicazione principale che utilizzeremo è JournalCtl, quindi il nome dell'articolo. Quindi ascolta attentamente come il giorno giusto, potresti essere felice di sapere come funziona.

Dove vengono archiviati i registri di sistema? E in quale formato è memorizzato?

Prenderemo presupposto che tu abbia un sistema normale, perché SystemD può essere personalizzato per essere in luoghi eccezionali. Inoltre, alcune distribuzioni Linux come Ubuntu 16.04 Registrazione persistente disabilita per impostazione predefinita, che impedisce a SystemD di svolgere correttamente il proprio lavoro. Se si dispone di tale distribuzione, modifica/etc/systemd/journald.Conf File, Cambia Storage = auto in archiviazione = persistente e infine, riavvia.

Quindi troverai normalmente i file di registro SystemD in/var/log/journal. Il sistema di journaling è esso stesso un servizio chiamato System-Journald.servizio. Proviamo a elencare i file in questa directory:

# ls/var/log/journal/-r
/var/log/journal/:
15E43C1734090AC7FBEA6B40FCD99D31
/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31:
[email protected] ~
Sistema@62AC1299826D036CB043D6C06A9493B7-000000000000000001-00067D6410099A19.rivista
[email protected] ~
User-1000@2123bc076b58569fe1fb13e9dbc1b0e0-00000000000000000001-0007fe36ac2810e0.rivista
User-1000.rivista
[Molti altri file come quelli sopra ...]

Perché voglio che continui a leggere, ho dovuto abbreviare l'output in quanto contiene molti file (nel mio esempio, più di 60 file), mi dispiace per questo! Continto di aprirne uno forse?

# head-bytes = 512/var/log/journal/15e43c1734090ac7fbea6b40fcd99d31/user-1000@2123bc076
B58569FE1FB13E9DBC1B0E0-0000000000000001-0007FE36AC2810E0.rivista
?s, q?n/flz???Ulz?l?"????
?_?B???z????o?y1kn ?io?eo??W?u? ?=?x0?L?D?7??X4n#?e? D3L?
P??o | MFO:?!Qs?.tk??R?\??1?| 5 ????$?G??#?S??;??B7???????T???Y????Mn?Q????ZQ
?Yv?e?????Bd?C?? Wf??D |
?2?? 7???????[??Un?= 8????C?2 = p?E?" ?0
????*????_?? ???
5?????yk?G? ?6?|??u??W: #12?Y??
3 tu;???'?JX??2?X'?=??[Q???@Z
T_???3ehmd?@?_?>??3s???,lr?.?$?G?L???S?/E??M1??Q???

Ehi, vedi, non sembra davvero i soliti file di registro che vedi giusto? Non preoccuparti, questo file non è corrotto, hai appena scoperto un aspetto di SystemD: SystemD memorizza i file in formato binario. Ecco perché è il più piccolo possibile: i dati strutturati come il tempo o la posizione vengono archiviati direttamente in binario, che generalmente richiede meno byte rispetto al testo. Ma questa non è l'unica ragione.

SystemD non memorizza solo le linee di registro. Il suo intento è quello di facilitare il monitoraggio e l'esplorazione dei registri. Per aiutare in questa attività, i messaggi di registro sono in realtà una riga di testo accompagnato da dati come la gravità del registro (avviso, errore, ecc.) o persino campi che sarebbero utili solo alla tua applicazione (URL richiesto per esempio).

# JournalCtl --Output = Verbose -All
Priorità = 6
_Uid = 0
_Gid = 0
_Cap_effective = 3ffffffffff
_Boot_id = ee4cc2ce7e8273aaffb5fc59c873ce7b
_Machine_id = bc422e0feaab64bb7dd218c24e6830e5
_HostName = Linux
Syslog_facility = 3
Syslog_identifier = systemd
Unità = dnf-makecache.servizio
_Transport = Journal
_Pid = 1
_Comm = systemd
_Exe =/usr/lib/systemd/systemd
_Cmdline =/usr/lib/systemd/systemd-switched-root-system--deserialize 76
_Systemd_cgroup =/init.scopo
_Systemd_unit = init.scopo
_Systemd_slice =-.fetta
_Selinux_Context = System_u: System_R: init_t: S0
Code_file = src/core/lavoro.C
Code_line = 795
Code_function = job_log_status_message
Message_id = A76E08846F5F0971371DBB1126E62E1
Messaggio = avviato dnf makecache.
# JournalCtl-Catalog-Lines = 3000-Pager-end "_transport = kernel" Result = Done
_Source_realtime_timestamp = 1532886335471422

Ti ho detto che ci sono molti campi (qui ci sono 25 campi o 29 timestamp di conteggio), tutto lo snippet sopra è solo per un singolo messaggio di registro! Il grande vantaggio è che puoi eseguire una ricerca filtrando su qualsiasi campo in questo messaggio di registro. Questo ti consente davvero di filtrare avanzato.

Uno dei filtri più ovvi che vorresti è filtrare dal servizio. Come puoi vedere sopra, c'è un campo di unità in modo da poter filtrare facilmente per ottenere solo messaggi di registro da un servizio. Te lo dico di più in seguito.

Ma questa quantità di dati significa anche qualcos'altro: in quasi tutti i casi, non aprirai mai un file di registro manualmente e non toccherai mai nella cartella/var/log/journal. Utilizzerai JournalCtl per qualsiasi attività relativa alla registrazione. Non esiste una cosa di rotazione del registro, tutto è gestito dal tempo del messaggio di registro.

Inoltre, il numero di campi dipenderà da quanto è buona l'integrazione di SystemD nella tua applicazione. Più campi contiene un messaggio di registro, meglio è. Per i servizi di sistema di base, SystemD si è già preso cura di fare una buona integrazione ma per altre applicazioni e servizi, la qualità dell'integrazione varia molto. Normalmente, questo dovrebbe migliorare nel tempo man mano che le persone si abituano al sistema.

Ok, ora è il momento di scoprire le funzionalità di Journalctl.

Comandi più usati per JournalCtl

Il primo comando che potresti voler dare un'occhiata è quello che mostra i registri del kernel Linux. Sì, SystemD gestisce anche l'articolazione dei registri del kernel, in modo da poter ottenere anche i registri degli stivali precedenti. Ecco il comando:

# JournalCtl-Catalog-Lines = 3000-Pager-end "_Transport = kernel"

Ti mostra un cercapersone dove puoi vedere gli ultimi messaggi. È possibile scorrere fino alle ultime 3.000 righe usando i tasti freccia (↑ / ↓) o pagina verso il basso / pagina verso il basso. Il flag -catalog indica a JournalCtl di mostrare il contesto attorno alle linee di registro, proprio come il riavvio di computer o, in altri contesti, un servizio che si ferma / avvio. Metto sempre questa bandiera poiché il contesto conta sempre, aiuta a sapere in quale situazione è apparsa la linea di tronchi, quindi puoi indovinare perché hai ottenuto questa linea di registro.

Ora, forse vuoi vedere solo le righe di registro dallo stivale corrente:

# JournalCtl-Catalog-Lines = 35000-Pager-end --boot "_transport = kernel"

Nota l'argomento della riga di comando -boot funziona in tutte le situazioni, non solo con i registri del kernel. Se preferisci iniziare dall'inizio:

# JournalCtl -Catalog --Boot "_Transport = Kernel"

Non so se è il caso per te, ma ho abbastanza tronchi del kernel! E che dire di avere una panoramica generale della tua macchina?

# JournalCtl-Catalog-Lines = 3000-Pager-end

Wow, ci sono molte cose che accadono sul tuo sistema! Un po 'di filtraggio sarebbe utile qui. Uno dei filtri più utilizzati è corrispondere a un servizio specifico (come il server SSH o il server HTTP), il nome del file di unità di sistema per il servizio SSH è SSHD.Servizio, quindi:

# JournalCtl-Catalog-Lines = 3000-Pager-end-Unit = sshd.servizio

È bello, non è vero? Beh, è ​​utilizzabile solo se conosci il nome del servizio - ma in molti casi, non conosci il nome di quel servizio. Se ti trovi in ​​tale situazione, potresti voler un elenco dei servizi, le loro descrizioni e il loro stato:

# SystemCtl Elenco-Unit --Type = Service

Ok, questo problema è ora risolto. Ma a volte, hai un messaggio di errore che ricevi da un sistema esterno come il tuo sito Web o da un'applicazione sul desktop. Quindi probabilmente vorrai cercare una parola o una frase specifica nel messaggio di registro. Dal momento che SystemD V237, ora è possibile.

In JournalCtl, la ricerca è insensibile al caso se la parola ricerca è tutta in minuscolo. Quindi, se cerchi la porta di parole, cercherà anche la porta Word con lettere capitalizzate. Un esempio:

# JournalCtl-CATALOG-LINES = 3000-Pager-end --Grep = "Port"

Ora, se cerchi una parola come la CPU, cercherà solo la CPU con tutte le lettere capitalizzate, non cercherà la CPU.

# JournalCtl-CATALOG-LINES = 3000-Pager-end --Grep = "CPU"

Ricordi il messaggio di errore dal sistema esterno? Generalmente, questi messaggi contengono un timestamp. Per filtrare il messaggio di registro, potresti voler utilizzare quel timestamp. JournalCtl può elencare tutti i messaggi di registro poiché una data e ora specifica con l'argomento -since:

# JournalCtl-CATALOG--Since = "2018-07-30 09:30:00"

Se quel sistema esterno è remoto o utilizza i timestamp UTC, ti consigliamo di filtrare in base a una data, ora e visualizzazione UTC nel terminale in cui i timestamp UTC in modo da non aver bisogno di convertirlo nella testa, che tende ad essere davvero confuso. Per fare ciò, dovrai aggiungere UTC dopo la corda di tempo nell'argomento. Dovrai quindi aggiungere il flag -UTC. Quindi, per esempio:

# JournalCtl-CATALOG--Since = "2018-07-30 10:45:00 UTC" --UTC

Nota È possibile utilizzare il flag -UTC da solo, in questo caso visualizzerà sostanzialmente tutte le date e i tempi nel fuso time UTC.

# JournalCtl-Catalog-Lines = 3000-Pager-end --UTC

I registri sono meglio gestiti con JournalCtl

Come puoi vedere con tutti i comandi precedenti, SystemD Journaling semplifica il filtraggio e il debug in quanto puoi selezionare tutte le righe di registro utilizzando un singolo comando, JournalCtl. Alcuni di voi probabilmente conoscevano tempi antichi in cui dovevi aprire manualmente ogni file in /var /log per avere un'idea generale del problema e di quello che è successo. Con tutti i suggerimenti che hai imparato qui, possiede strumenti solidi per guardare i tuoi messaggi di registro nel modo in cui lo desideri.