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 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 json
o 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 procesojournalctl _UID=<identificador>
te permitirá filtrar por usuariojournalctl _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,