Journalctl y los logs de Systemd en Linux

El proceso que gestiona las notificaciones del sistema en systemd es systemd-journal y tiene una herramienta para gestionarlo que es journalctl.  


Con journalctl podemos consultar todos los registros del sistema en Linux o hacer consultas específicas.

 
Journalctl
 

El servicio que escribe los registros del journal de systemd es systemd-journald.service.

 

En este artículo:

 

 

 

 

 

Resumen de las opciones de journalctl

:
 

  • journalctl

    → inicia la herramienta

  •  

  • journalctl --list-boots

    → muestra los inicios o reinicios

  •  

  • journalctl --since "2017-08-16 18:46:30" --until "2017-08-16 18:55:00"

    → filtrar los datos por fecha

  •  

  • journalctl –u cron

    → filtramos las entradas por servicio

  •  

  • journalctl –f

    → añade las nuevas entradas (como tail -f)

  •  

  • journalctl –p err

    → filtramos las entradas por prioridad

  •  

  • journalctl --disk-usage

    → muestra el espacio ocupado por logs

  •  

  • journalctl -k

    → muestra solo mensajes del kernel

  •  

  • journalctl -g ‘patrón’

    → busca según un patrón (soporta regex)

  •  

 

 

Visualización básica de registros de journalctl

 

  • journalctl : Muestra todos los registros existentes en el journal. Se muestran arriba del todo los más antiguos. Es mejor que paginemos la salida de datos, con less por ejemplo.

 

 

Filtrar el journal por tiempo

 

  • Para mostrar registros del arranque actual (útil cuando hacemos un uso diario de journal):
journalctl -b

 

  • Mostrar los reinicios registrados en el journal:
journalctl --list-boots

 

Esto nos mostrará una linea para cada arranque.

-3 b69d56b2e608403792212edc8a9fba24 Fri 2019-08-23 17:58:28 CEST—Fri 2019-08-23 17:59:53 CEST
-2 efa94b7e04a643ffba1353c5439bdd1a Fri 2019-08-23 18:18:11 CEST—Fri 2019-08-23 18:23:40 CEST
-1 f217f1719ffc46caa264d13ffb133450 Tue 2019-10-01 16:24:37 CEST—Tue 2019-10-01 16:26:03 CEST

 

journalctl list boots

 

En la primera columna veremos el número de arranque, que podemos usar para visualizar el journal de ese arranque. La segunda columna muestra el ID del arranque, que también podemos utilizar.

 

Por ejemplo, para ver el registro de un reinicio concreto, en este caso del arranque anterior:

journalctl -b -1

 

o para ver el journal de hace 2 reinicios:

journalctl -b -2

 

 

Ventanas de tiempo con journalctl

 
Si queremos mostrar los registros dentro de un marco de tiempo concreto, podremos usar algunos parámetros entre fechas y horas.

Hemos de tener en cuenta que el formato de fecha es:

YYYY-MM-DD HH:MM:SS

 

  • Para ver los registros durante una ventana de tiempo concreta:

usaremos since y until

 

  • Por ejemplo, para ver los registros desde el 28 de septiembre de 2019, usaremos:

journalctl –since “2019-09-28 17:15:00”

journalctl since fecha hora

 

 

 

  • Con journal también podemos usar valores relativos como ayer (yesterday), hoy (today), mañana (tomorrow) o ahora (now). Por ejemplo, para obtener los datos del registro del día anterior (ayer):

journalctl –since yesterday

 

 

Filtrar por mensajes de interés

 

Con journalctl podemos filtrar también por servicio o componente. Hay diversas formas de hacerlo.

 

journalctl -u rsyslog.service

 
journalctl filtrar por unidad

(para encontrar las unidades en nuestro sistema podemos ejecutar systemctl list-units)

 

  • Filtrar intercalando varias unidades:
journalctl -u rsyslog.service -u anacron.service

journalctl filtrar por varios servicios

 

  • Combinando los filtros anteriores, buscamos el journal para varios servicios, con una ventana de tiempo concreta:
journalctl -u cups.service -u acpid.service --since today

 

journalctl combinar filtros

 

 

 

Filtrando por proceso, usuario o ID de grupo

 

  • Algunos servicios generan procesos secundarios. Si conocemos el PID exacto, podemos realizar filtros en el journal por medio del PID.

 

Por ejemplo, filtraremos por el PID 1, que corresponde al servicio systemd:

journalctl _PID=1

 

journalctl filtrar por PID

 

 

Lo primero que vamos a hacer es averiguar el UID de un usuario. En este caso averiguamos el UID del usuario test:

id -u test

y sabiendo que el UID de dicho usuario es el 1001, filtramos:

journalctl _UID=1001

 

journalctl filtrar por UID de usuario
 

 

  • El journal de systemd tiene muchos campos por los que podemos filtrar. Para averiguar dichos campos, usamos:
man systemd.journal-fields

journalctl systemd.journal fields

 

  • Para ver para qué GID el journal de systemd tiene registros, podemos usar la opción
-F

 

journalctl opcion -F

 

Así que vamos a buscar los GID disponibles en journal:

journalctl -F _GID

Y el resultado arrojado es:

 

1001
1000
114
117
103
125
122

Sabemos que el GID de test es 1001

ya que

cat /etc/group | grep 1001

muestra

test:x:1001:

 

Ahora, sabiendo lo anterior, comprobamos las entradas en el journal para el GID 1001:

journalctl _GID=1001

 

journalctl filtrar campos GID

 

 

También podemos filtrar por ruta de componente

 

  • Por ejemplo, vamos a ver los registros del servicio de OpenSSH, buscando en su ruta de componente /usr/sbin/sshd :

 

journalctl /usr/sbin/sshd

 

-- Logs begin at Thu 2016-11-03 18:16:43 CET, end at Tue 2019-10-01 18:17:12 CES
Oct 01 18:00:26 Rasp sshd[491]: Server listening on 0.0.0.0 port 22.
Oct 01 18:00:26 Rasp sshd[491]: Server listening on :: port 22.
Oct 01 18:14:27 Rasp sshd[506]: Accepted password for pi from 192.168.8.
Oct 01 18:14:27 Rasp sshd[506]: pam_unix(sshd:session): session opened f
lines 1-5/5 (END)

 

journalctl filtrar por ruta de componente

 

 

Mostrar mensajes del kernel con journalctl

 

  • Por defecto se muestran los mensajes de kernel del arranque actual con journalctl -k:

Si además usamos la opción -r, el resultado son los mensjes del kernel del arranque actual, ordenador por los más recientes a los más antiguos:

journalctl -k -r

journalctl mostrar mensajes de kernel recientes

 

 

  • Para mostrar los mensajes del kernel de otros arranques anteriores:
journalctl -k -b -5

 

 

Filtrar mensajes de journal según la prioridad

 

Este tipo de filtro de mensajes de journal es muy interesante. En ocasiones buscamos concretamente los mensajes de error del sistema, y con este tipo de filtro podemos encontrarlos rápidamente.

Estos son los tipos de prioridad existentes en los mensajes de registro:

  • 0: emerg
  • 1: alert
  • 2: crit
  • 3: err
  • 4: warning
  • 5: notice
  • 6: info
  • 7: debug

 

Así que teniendo esto en cuenta, vamos a filtrar y mostrar con journalctl los mensajes de error solamente, usando la opción -p (prioridad) :

journalctl -p err -b

 

El comando anterior muestra los mensajes de prioridad 3 (err), del arranque actual.

journalctl mostrar mensajes según prioridad de error