Gestioneu els missatges de registre amb Systemd mitjançant Journalctl [Guia completa]


Systemd és un gestor de sistemes i serveis d'avantguarda per a sistemes Linux: un reemplaçament del dimoni d'inici destinat a iniciar processos en paral·lel a l'arrencada del sistema. Ara és compatible amb una sèrie de distribucions principals actuals, com ara Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS, etc.

Abans, vam explicar la història darrere d'init i systemd; on vam discutir quins són els dos dimonis, per què s'havia de substituir tècnicament init per systemd, així com les principals característiques de systemd.

Un dels principals avantatges de systemd respecte d'altres sistemes d'inici comuns és el suport per a la gestió centralitzada del registre de sistemes i processos mitjançant un diari. En aquest article, aprendrem a gestionar i veure els missatges de registre amb systemd mitjançant l'ordre journalctl a Linux.

Important: abans d'avançar en aquesta guia, potser voldreu aprendre a gestionar la creació i execució de noves unitats de servei a systemd mitjançant scripts d'intèrpret d'ordres a Linux. Tanmateix, si estàs d'acord amb tot l'anterior, segueix llegint.

Configuració de Journald per a la recollida de missatges de registre sota Systemd

journald és un dimoni que recull i escriu entrades de diari de tot el sistema; es tracta bàsicament de missatges d'arrencada, missatges del nucli i del syslog o diverses aplicacions i emmagatzema tots els missatges en una ubicació central: fitxer de diari.

Podeu controlar el comportament de journald mitjançant el seu fitxer de configuració predeterminat: /etc/systemd/journald.conf que es genera en temps de compilació. Aquest fitxer conté opcions els valors de les quals podeu canviar segons els requisits del vostre entorn local.

A continuació es mostra una mostra de l'aspecte del fitxer, vist amb l'ordre 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

Tingueu en compte que diverses instal·lacions de paquets i extractes de configuració d'ús a /usr/lib/systemd/*.conf.d/ i configuracions de temps d'execució es poden trobar a /run/systemd/journald.conf.d/*.conf que potser no necessàriament utilitzar.

Diverses distribucions de Linux, inclosa Ubuntu i els seus derivats com Linux Mint, no permeten l'emmagatzematge persistent dels missatges d'arrencada al disc de manera predeterminada.

És possible activar-ho configurant l'opció \Emmagatzematge a \persistent, tal com es mostra a continuació. Això crearà el directori /var/log/journal i tots els fitxers de la revista s'emmagatzemaran a sota.

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

Per a opcions addicionals, cerqueu el significat de totes les opcions que se suposa que s'han de configurar a la secció [Diari] escrivint.

$ man journald.conf

Per a una gestió de registre fiable amb systemd mitjançant el servei journald, assegureu-vos que la configuració de l'hora, inclosa la zona horària, sigui correcta al sistema.

Per veure la configuració actual de data i hora al vostre sistema, escriviu.

$ 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 configurar la zona horària correcta i possiblement l'hora del sistema, utilitzeu les ordres següents.

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

journalctl és una utilitat que s'utilitza per visualitzar el contingut de la revista systemd (que està escrita pel servei journald).

Per mostrar tots els registres recollits sense cap filtre, escriviu.

$ 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 ([email )
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

Podeu mostrar una llista de números d'arrencada (relatius a l'arrencada actual), els seus ID i les marques de temps del primer i l'últim missatge corresponent a l'arrencada amb l'opció --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 veure les entrades del diari des de l'arrencada actual (número 0), utilitzeu el commutador -b d'aquesta manera (igual que la sortida de mostra anterior).

$ journalctl -b

i per veure un diari de l'arrencada anterior, utilitzeu el punter relatiu -1 amb l'opció -b com a continuació.

$ journalctl -b -1

Alternativament, utilitzeu l'ID d'arrencada com aquesta.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Per utilitzar l'hora en format de temps universal coordinat (UTC), afegiu les opcions --utc de la manera següent.

$ journalctl --utc

Per veure totes les entrades des d'una data i hora concretes, p. ex. 15 de juny de 2017 a les 8:15, escriviu aquesta ordre.

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

Per veure els missatges de registre recents (10 per defecte), utilitzeu la marca -n com es mostra a continuació.

$ journalctl -n
$ journalctl -n 20 

Per veure només els missatges del nucli, de manera similar a la sortida de l'ordre dmesg, podeu utilitzar el senyalador -k.

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

Per veure totes les entrades de diari d'una unitat concreta, utilitzeu l'interruptor -u de la manera següent.

$ journalctl -u apache2.service

Per reduir a zero a l'arrencada actual, escriviu aquesta ordre.

$ journalctl -b -u apache2.service

Per mostrar els registres de l'arrencada anterior, feu servir això.

$ journalctl -b -1 -u apache2.service

A continuació es mostren algunes altres ordres útils:

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

Per veure els registres generats per un procés específic, especifiqueu el PID com aquest.

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

Per veure els registres generats per un usuari o grup específics, especifiqueu el seu ID d'usuari o grup com aquest.

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

Per mostrar tots els registres generats per un fitxer (possiblement un executable), com ara l'executable D-Bus o els executables bash, simplement escriviu.

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

També podeu filtrar la sortida en funció de les prioritats dels missatges o dels intervals de prioritats utilitzant el senyalador -p. Els valors possibles són: 0 – emerg, 1 – alert, 2 – crit, 3 – err, 4 – warning, 5 – notice, 6 – info, 7 – debug):

$ journalctl -p err

Per especificar un interval, utilitzeu el format següent (emergeix a advertència).

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

Pràcticament podeu veure els registres mentre s'escriuen amb l'opció -f (similar a la funcionalitat tail -f).

$ journalctl -f

Si voleu controlar el format de sortida de les entrades de diari, afegiu el senyalador -o i utilitzeu aquestes opcions: cat, export, json, json-pretty, json-sse, short, short-iso, curt monòton, breu precís i detallat (comproveu el significat de les opcions a la pàgina de manual:

L'opció cat mostra el missatge real de cada entrada del diari sense cap metadades (marca de temps i així successivament).

$ journalctl -b -u apache2.service -o cat

Per comprovar la coherència interna del fitxer diari, utilitzeu l'opció --verify. Si tot està bé, la sortida hauria d'indicar un PASS.

$ journalctl --verify

PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/system.journal                               
491f68: Unused data (entry_offset==0)                                                                
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 9866c3d4d.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 5d8945a9e.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 1becab02f.journal
PASS: /run/log/journal/2a5d5f96ef9147c0b35535562b32d0ff/[email 01cfcedff.journal

També podeu mostrar l'ús actual del disc de tots els fitxers de diari amb les opcions --disk-usage. Mostra la suma de l'ús del disc de tots els fitxers de diari actius i arxivats:

$ journalctl --disk-usage

Per suprimir fitxers de diari antics (arxivats), executeu les ordres següents:

$ 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

Per últim, però no menys important, podeu indicar a journald que giri els fitxers de diari amb l'opció --rotate. Tingueu en compte que aquesta directiva no torna fins que s'ha acabat l'operació de rotació:

$ sudo journalctl --rotate

Per obtenir una guia d'ús detallada i opcions, consulteu la pàgina de manual de journalctl de la següent manera.

$ man journalctl

Fes una ullada a alguns articles útils.

  1. Gestionar el procés d'inici del sistema i els serveis (SysVinit, Systemd i Upstart)
  2. Petiti: una eina d'anàlisi de registres de codi obert per a administradors de sistemes Linux
  3. Com configurar i gestionar la rotació del registre mitjançant Logrotate a Linux
  4. lnav: mira i analitza els registres d'Apache des d'un terminal Linux

Això és tot per ara. Utilitzeu els comentaris que apareixen a continuació per fer qualsevol pregunta o afegir-hi opinions sobre aquest tema.