Journalctl y logs en Systemd

Este es uno de los capítulos del tutorial Trabajando con Systemd. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Si has empezado a trabajar con Systemd, seguro que en mas de una ocasión te ha surgido la necesidad de ver que sucede con uno o con otro servicio. Ya sea, por que has creado tu propio servicio, conforme te explique en el capítulo sobre como crear un servicio con Systemd, o porque es un servicio de terceros. Sea como fuere, conocer como acceder y consultar el sistema de logs de Systemd es algo que seguro te va a venir de perlas.

Así, en este nuevo capítulo del tutorial sobre como trabajar con Systemd, verás como puedes utilizar, visualizar y gestionar el sistema de logs de Systemd.

Journalctl y logs en Systemd

Journalctl y el sistema del logs de Systemd

Una de las grandes ventajas de Systemd es la centralización de la gestión de los logs. Solo necesitas consultar journalctl para consultar todos los logs.

Sin embargo, como ya imaginas, esto también es un inconveniente a priori. Y digo que es un inconveniente en tanto en cuanto, hay mucha, pero que mucha información. En este sentido, es necesario filtrar el contenido con el objetivo de encontrar la información que necesitas.

Así, los desarrolladores de Systemd han tenido en cuenta esto, y el sistema de filtrado de journalctl es realmente muy potente. De esta forma, va a ser relativamente sencillo que encuentres lo que necesitas.

Lo mas básico de journalctl

Para empezar a consultar los logs en tu equipo tan solo tienes que ejecutar journalctl. Con esto ya estás viendo el contenido. Y ¿como funciona ese visor del log? No te preocupes que no debes aprender nada nuevo, porque es less, con las ventajas que esto representa. Si quieres sacarle todo el potencial a esta increíble herramienta, te recomiendo que le des una lectura al artículo que escribí sobre menos es mas con less.

Sin embargo, indicarte que además de lo más basico para desplazarte en el log, es muy interesante las posibilidades que te ofrece para buscar utilizando /[patrón] y ?[patrón]. El primero te permite buscar desde el inicio y el segundo desde el final.

En cualquier caso, te recomiendo que le des un vistazo al artículo que te he mencionado.

Salida

Es posible controlar el formato de salida. No solo puedes obtener los resultados de tu búsqueda con el formato tradicional, sino que también lo puedes obtener en otros formatos, como puede ser jsono json-pretty. Así por ejemplo,

journalctl -u bluetoot.service -o json-pretty

La diferencia entre json y json-pretty es que en el segundo caso, lo formatea para que sea mas sencillo de leer.

Filtros para el sistema de logs de Systemd

Como te he comentado anteriormente, dada la gran cantidad de información que se puede guardar en los logs de Systemd, es necesario utilizar algún sistema que te permita realizar búsquedas con sencillez.

Así tienes disponibles al menos los siguientes filtros,

Relativo al inicio

Ejecutando journalctl -b puedes ver los mensajes relativos al inicio, boot. Dependiendo de la distribución que utilices es posible que se guarde mas de un inicio. Este es el caso de Ubuntu, que por defecto te guarda varios inicios.

Si quieres listar los inicios que tienes guardados tienes que ejecutar journalctl --list-boots. Y si quieres ver el listado de un inicio concreto tan solo tienes que ejecutar journalctl -b n donde n es el número del inicio. Ten en cuenta que empieza en 0, y va en sentido decrecente. Es decir, el inmediatamente anterior es el -1, el predecesor el -2 y así sucesivamente. También es posible mostrar un inicio en concreto indicando su identificador.

En el caso de que tu equipo no guarde registros de inicios pasados, puedes modificar el comportamiento desde el archivo de configuración del journal. Para esto tienes que modificar el archivo /etc/systemd/journal.conf y en la sección [Journal] establecer la opción Storage a persistent.

Filtrado por fecha

También puedes ver los mensajes que aparecen en el log indicando las fechas entre las que quieres ver esos mensajes. El formato de fecha y hora es `YYYY-MM-DD HH:MM:SS Así si quieres ver los registros que se produjeron desde el día 12 de enero, puedes ejecutar algo como,

journalctl --since "2019-04-12"

Si quieres ser mas concreto puedes especificar también la hora

journalctl --since "2019-04-12 14:45:23"

Lo mismo para el caso de que quieras ver los registros hasta una fecha determinada. Digamos un mes después del anterior,

journalctl --until "2019-05-12"

Por supuesto, puedes ver los registros entre dos fechas determinadas. Por ejemplo,

journalctl --since "2019-04-12" --until "2019-05-12"

También puedes utilizar palabras clave como, yesteday, today, tomorrow, now. Así como utilizar + o -, y otras palabras claves como ago y left. Así, algunos ejemplos,

journalctl --since "-5 day" 
journalctl --since "yesterday"

Filtrado por servicio o unidad

Con el fin de dar con el problema cuando estás creando tu propio servicio o diagnosticando un servicio ajeno, resulta imprescindible filtrar por servicio. En este sentido, tan solo tienes que utilizar la opción -u. Así por ejemplo si quieres ver lo que ha sucedido con el servicio bluethooth.service, solo tienes que ejecutar la siguiente orden,

journalctl -u bluetooh.service

Por supuesto, esto, lo puedes combinar con los filtrados anteriores. Si por ejemplo, solo quisieras ver lo que ha se ha producido en los arranques,

journalctl -u bluetooh.service -b

Y si además quisieras ver solo los que se han producido en los arranques desde el día de ayer

journalctl -u bluetooh.service -b --since yesterday

Igualmente puedes combinar varios servicios,

journalctl -u bluetooh.service -u dbus.service

Filtrado por proceso, usuario o grupo

Al igual que has visto que es posible filtrar por unidad o servicio, también es posible filtrar por proceso, por usuario o grupo. Tanto para el caso del usuario como del grupo, tendrás que indicar el número del usuario o del grupo.

Así las opciones son las siguientes,

  • journalctl _PID=<identificador> para filtrar por proceso
  • journalctl _UID=<identificador> te permitirá filtrar por usuario
  • journalctl _GID=<identificador> para filtrar por grupo

Para conocer el número de un usuario, puedes ejecutar la siguiente instrucción,

id -u lorenzo

Esto mismo para el usuario actual, es tan sencillo como,

id -u $USER

Mientras que para conocer el número de grupo, puedes ejecutar la siguiente instrucción,

id -g lorenzo

Por supuesto esto lo puedes combinar con lo que has visto anteriormente, para mostrar todo lo relativo al usuario actual

systemctl _UID=$(id -u $USER)

Y al igual que has visto para el caso de las unidades o servicios, también es posible filtrar por fechas. De esta forma, para ver lo que sucedió desde ayer, puedes utilizar,

systemctl _UID=$(id -u $USER) --since yesterday

Además de los campos _UID, _GID y _PID, existen mas campos por los que puedes filtrar en journalctl. Puedes consultarlos desde la página del manual correspondiente, ejecutando la siguiente instrucción man systemd.journal fields.

Por último, si quieres conocer los usuarios, grupos o procesos, o cualquier otro tipo de campo de los admitidos por journalctl, tienes que ejecutarlo con la opción -F. Así para conocer que usuarios han aparecido en el journal, tienes que ejecutar,

journalctl -F _UID

Esto mismo aplicado a los ejecutables, se traduce en,

journalctl -F _EXE

Filtrado por ejecutable

Como has visto en el apartado anterior, también es posible filtrar por ejecutable, al igual que haces por usuario, grupo, etc. Así para tener información sobre /usr/bin/python2.7, puedes ejecutar la siguiente instrucción,

journalctl _EXE=/usr/bin/python2.7

o directamente,

journalctl /usr/bin/python2.7

Filtrado por mensajes del núcleo

Para tener información sobre los mensajes del núclo o kernel, tienes que utilizar la opción -k. Esto lo puedes combinar como otras opciones. Por ejemplo, para ver todos los mensajes del kernel desde ayer, tendrás que ejecutar,

journalctl -k --since yesterday

Filtrado por prioridad

Es posible mostrar mensajes correspondientes a una determinada prioridad, o a varias. Las prioridades disponibles son las siguientes,

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

Así si quieres mostrar las prioridades de nivel 0, tienes que ejecutar la siguiente instrucción,

journalctl -p 0

o

journalctl -p emerg

Pero, como te he indicado anteriormente, puedes mostrar mas de un nivel. De esta forma para mostrar los mensajes de los tres primeros niveles, y que se produjeron desde ayer, la instrucción se resumiría en,

journalctl -p 0 -p 1 -p 2 --since yesterday

Monitorización

Es posible realizar el seguimiento de lo que se produce en el journal, al igual que te comenté que se podía hacer con tail y que te indiqué en el capítulo sobre[procesar texto en el tutorial sobre[el terminal. De esta forma, vas a poder realizar un seguimiento en tiempo real de lo que se va produciendo en el journal. Para esto ejecuta la instrucción,

journalctl -f

Si quisieras hacer lo mismo, pero viendo los últimos 100 mensajes, y luego continuar monitorizando el journal, la instrucción sería tal que,

journalctl -f -n 100

Para detener la monitorización, tienes que utilizar el atajo de teclado Ctrl+C.


Más información,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *