Administre los mensajes de registro en Systemd usando Journalctl [Guía completa]


Systemd es un administrador de sistemas y servicios de vanguardia para sistemas Linux: un reemplazo de daemon de inicio destinado a iniciar procesos en paralelo en el arranque del sistema. Ahora se admite en una serie de distribuciones principales actuales que incluyen Fedora, Debian, Ubuntu, OpenSuSE, Arch, RHEL, CentOS, etc.

Anteriormente, explicamos la historia detrás de "init" y "systemd"; donde discutimos qué son los dos demonios, por qué ‘ init ’ técnicamente necesitaba ser reemplazado con ‘ systemd ’, así como las características principales de systemd.

Una de las principales ventajas de systemd sobre otros sistemas init comunes es el soporte para la administración centralizada del registro de sistemas y procesos utilizando un diario. En este artículo, aprenderemos cómo administrar y ver los mensajes de registro en systemd usando el comando journalctl en Linux.

rojo

Configuración de Journald para recopilar mensajes de registro en Systemd

journald es un demonio que recopila y escribe entradas de diario de todo el sistema; Estos son esencialmente mensajes de arranque, mensajes del kernel y de syslog o varias aplicaciones y almacena todos los mensajes en una ubicación central: archivo de diario.

Puede controlar el comportamiento de journald a través de su archivo de configuración predeterminado: /etc/systemd/journald.conf que se genera en el momento de la compilación. Este archivo contiene opciones cuyos valores puede cambiar para adaptarse a los requisitos de su entorno local.

A continuación se muestra una muestra de cómo se ve el archivo, visto con el comando cat.

$ cat /etc/systemd/journald.conf 

Archivo de configuración de Journald

# 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

Tenga en cuenta que varios paquetes instalan y usan extractos de configuración en /usr/lib/systemd/*.conf.d/ y las configuraciones de tiempo de ejecución se pueden encontrar en /run/systemd/journald.conf. d/*. conf que no necesariamente debes usar.

Una serie de distribuciones de Linux, incluyendo Ubuntu y sus derivados, como Linux Mint, no habilitan el almacenamiento persistente de los mensajes de arranque en el disco de forma predeterminada.

Es posible habilitar esto configurando la opción " Almacenamiento " en " persistente " como se muestra a continuación. Esto creará el directorio /var/log/journal y todos los archivos de diario se almacenarán debajo de él.

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

Para configuraciones adicionales, encuentre el significado de todas las opciones que se supone que están configuradas en la sección “[Diario]” ​​ escribiendo.

$ man journald.conf

Para una administración de registros confiable bajo systemd usando el servicio journald, asegúrese de que la configuración de tiempo, incluida la zona horaria, sea correcta en el sistema.

Para ver la configuración de fecha y hora actual en su sistema, escriba.

$ 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

Para establecer la zona horaria correcta y, posiblemente, la hora del sistema, use los comandos a continuación.

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

journalctl es una utilidad que se usa para ver el contenido del diario de systemd (que está escrito por el servicio de journald).

Para mostrar todos los registros recopilados sin ningún tipo de filtrado, escriba.

$ journalctl

Ver mensajes de registro

-- 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 protected])
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

Puede mostrar una lista de números de inicio (relativos al inicio actual), sus ID y las marcas de tiempo del primer y último mensaje correspondientes al inicio con la opción --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 

Para ver las entradas de diario del inicio actual (número 0), use el interruptor -b de esta manera (igual que la salida de muestra anterior).

$ journalctl -b

y para ver un diario del inicio anterior, use el puntero relativo -1 con la opción -b como se muestra a continuación.

$ journalctl -b -1

Alternativamente, use la ID de arranque como esta.

$ journalctl -b 9fb590b48e1242f58c2579defdbbddc9

Para usar la hora en formato de hora universal coordinada (UTC), agregue las opciones --utc de la siguiente manera.

$ journalctl --utc

Para ver todas las entradas desde una fecha y hora en particular, por ejemplo, 15 de junio de 2017 a las 8:15 a.m., escriba este comando.

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

Para ver los mensajes de registro recientes (10 de forma predeterminada), use la marca -n como se muestra a continuación.

$ journalctl -n
$ journalctl -n 20 

Para ver solo los mensajes del kernel, similares a la salida del comando dmesg, puede usar el indicador -k .

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

Para ver todas las entradas de diario de una unidad en particular, use el interruptor -u de la siguiente manera.

$ journalctl -u apache2.service

Para reducir al inicio actual, escriba este comando.

$ journalctl -b -u apache2.service

Para mostrar los registros del arranque anterior, use esto.

$ journalctl -b -1 -u apache2.service

A continuación hay algunos otros comandos útiles:

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

Para ver los registros generados por un proceso específico, especifique que su PID sea así.

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

Para ver los registros generados por un usuario o grupo específico, especifique su ID de usuario o grupo de esta manera.

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

Para mostrar todos los registros generados por un archivo (posiblemente un ejecutable), como el ejecutable D-Bus o los ejecutables de bash, simplemente escriba.

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

También puede filtrar la salida en función de las prioridades de los mensajes o los rangos de prioridad utilizando el indicador -p . Los valores posibles son: 0 - emerg, 1 - alerta, 2 - crit, 3 - err, 4 - aviso, 5 - aviso, 6 - info, 7 - depuración):

$ journalctl -p err

Para especificar un rango, use el siguiente formato (emergente a advertencia).

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

Prácticamente puede ver los registros mientras se escriben con la opción -f (similar a la funcionalidad tail -f ).

$ journalctl -f

Si desea controlar el formato de salida de las entradas de diario, agregue la marca -o y use estas opciones: cat, export, json, json-pretty, json-sse, short, short-iso, corto-monotónico, corto-preciso y detallado (verifique el significado de las opciones en la página del manual:

La opción cat muestra el mensaje real de cada entrada de diario sin metadatos (marca de tiempo, etc.).

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

Para verificar la coherencia interna del archivo de diario, use la opción --verify . Si todo está bien, la salida debe indicar un PASS.

$ journalctl --verify

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

También puede mostrar el uso actual del disco de todos los archivos de diario con las opciones --disk-use . Muestra la suma del uso del disco de todos los archivos de diario archivados y activos:

$ journalctl --disk-usage

Para eliminar archivos de diario antiguos (archivados), ejecute los siguientes comandos:

$ 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

Por último, pero no menos importante, puede indicar a journald que gire los archivos de diario con la opción --rotate . Tenga en cuenta que esta directiva no vuelve hasta que finalice la operación de rotación:

$ sudo journalctl --rotate

Para obtener una guía de uso en profundidad y opciones, vea la página de manual de journalctl de la siguiente manera.

$ man journalctl

Echa un vistazo a algunos artículos útiles.

  1. Managing System Startup Process and Services (SysVinit, Systemd and Upstart)
  2. Petiti – An Open Source Log Analysis Tool for Linux SysAdmins
  3. How to Setup and Manage Log Rotation Using Logrotate in Linux
  4. lnav – Watch and Analyze Apache Logs from a Linux Terminal

Eso es todo por ahora. Use los comentarios de abajo para hacer preguntas o agregar sus pensamientos sobre este tema.