Journalctl, algunos comandos interesantes

Publicado por Diego Córdoba en

Hoy aprenderemos a visualizar los logs del sistema en nuestras distros GNU/Linux con systemd utilizando la herramienta journalctl.

journal_portada

Alrededor del 2012, muchas distribuciones Linux cambiaron su tradicional «System V» init por el nuevo systemd. systemd es utilizado para arrancar el sistema operativo y administrar procesos. systemd incluye un componente auxiliar denominado «journalctl«, cuyo principal propósito es administrar los eventos de log del sistema, por lo que para los sysadmines y devops es una herramienta súper útil.

Ya hemos estado hablando de algunos comandos del nuevo systemd en SystemD vs SysVinit: algunos comandos.

Por defecto, el comando utilizado sin argumentos muestra todos los contenidos del journal, iniciando con la entrada más antigua que fue guardada.

Todos los usuarios por defecto pueden ver sus propios journals, no obstante, el acceso a los archivos de logs principales y a los logs de otros usuarios solo puede ser visto por usuarios privilegiados, como el root, o los usuarios pertenecientes a los grupos wheel, adm o systemd-journal.

Además, como los logs del sistema pueden ser muy cargados de información adicional y explicativa, journalctl permite pasarle parámetros para limitar la salida a entradas específicas.

Por defecto, las entradas más antiguas se muestran al principio. La salida es mostrada una pantalla a la vez, no obstante, podemos deslizarnos con las teclas del cursor para ver el resto de la salida, o presionando la tecla de espacio para desplazarnos pantallas enteras.

Las líneas están truncadas, no obstante podemos movernos con las teclas del cursor a izquierda y derecha para ver el contenido completo.

Otras variantes de journalctl

Veremos ahora algunas variantes de journalctl interesantes a la hora de administrar un sistema.

journalctl -r

Nos permite mostrar la salida del comando en orden invertido, los primeros debajo, y los últimos encima.

journalctl -x

Incluyendo la explicación de las salidas… aumentando la información entregada:

journalctl -f

Esta es una interesante opción que emula el clásico «tail -f /var/log/syslog«. Este comando nos permite ver el journal del ordenador en tiempo real, y las nuevas líneas las iremos viendo entrar a las salida del comando.

La opción «-f» viene de «follow» o seguir, por su significado del inglés.

journalctl -n12

Este comando nos permite limitar, en este caso particular, la salida a solamente las últimas 12 líneas. La cantidad de líneas dependen de la necesidad del usuario.

Limitando la salida por tiempo

Una opción muy interesante es la de filtrar la salida por tiempo, y mostrar únicamente los logs de cierta fecha, hora, o en un rango de tiempo.

Los tiempos se pueden especificar siguiendo el formato: YYYY-MM-DD HH:MM:SS (Año, mes, día, hora, minuto, segundo).

Por otro lado, esta estampa de tiempo puede ir acompañada de un --since para indicar «desde», y/o un --until para indicar «hasta».

Veamos los logs de algunas horas de un día específico:

Como se puede ver, estos logs son del 13 de julio del 2023, y van desde las 10 de la mañana, hasta las 12. Es la salida correspondiente al siguiente comando:

sudo journalctl --since "2023-07-13 10:00:00" --until "2023-07-13 12:00:00"

Por otro lado, puede omitirse tanto el --since como el --until y eliminar uno de los límites en la salida.

Además, este comando permite especificar fechas y tiempos en un formato más amigable y «humano» 🙂

Algunos ejemplos:

sudo journalctl --since "1 hour ago"
sudo journalctl --since "30 minutes ago"
sudo journalctl --since "30 minutes ago"
sudo journalctl --since "1 day ago"
sudo journalctl --since "1 wheek ago"
sudo journalctl --since "1 week ago"
sudo journalctl --since "1 month ago"
sudo journalctl --since "1 year ago"
sudo journalctl --since "1 year ago"

Por supuesto, --since puede ser sustituido por --until, o pueden usarse ambos:

sudo journalctl --since "2 hours ago" --until "30 minutes ago"

Eventos de un usuario específico

Sabiendo el UID de un usuario en Linux, podemos mostrar los eventos de dicho usuario sin inconvenientes:

diego@cryptos:~$ id andy
uid=1001(andy) gid=1001(andy) groups=1001(andy)
diego@cryptos:~$ sudo journalctl UID=1001
-- No entries --

Además, se puede combinar con las opciones anteriores, para filtrar por tiempo, cantidad de líneas, etc.

Eventos de un proceso particular

Podemos usar la opción _PID para listar los eventos de un proceso puntual.

Supongamos que necesitamos ver los eventos del proceso openbox. Podemos obtener su pid con:

╰$ pidof openbox
868

Luego usar journalctl para listar sus eventos, de esta manera:

sudo journalctl _PID=868

Eventos de un servicio

Para quienes administran servidores, por ahí les interesará saber cómo podemos ver los logs generados, por ejemplo, por el servicio de SSH.

En este caso, un comando tan simple como:

sudo journalctl -u sshd.service

Nos dará una salida como esta:

Podemos listar los eventos de varios servicios simultáneamente:

sudo journalctl -u sshd.service -u vsftpd.service

Para listar los servicios que están corriendo en nuestro ordenador podemos correr el siguiente comando:

sudo systemctl -t service -a

Mostrando log del inicio del ordenador

Es algo sumamente útil para saber si cierto y determinado servicio o componente se ha ejecutado correctamente o no al iniciarse el equipo, o detectar cualquier anomalía.

sudo journalctl -b

Mostrando los mensajes del kernel

Otra forma de ver información para debuggear información del sistema es ver los mensajes del núcleo del sistema:

sudo journalctl -k

Filtrando la salida con un patrón

Podemos filtrar la salida de journalctl con grep… no, no con el comando grep, sino con la opción --grep incorporada dentro del mismo journalctl.

Por ejemplo, supongamos que necesitamos ver todos los logs que tengan la palabra GnuPG en su cadena de texto. Podríamos emplear el comando:

sudo journalctl --grep=GnuPG

Obteniendo esta salida:

Filtrando por prioridad

Supongamos que necesitamos listar todos los eventos de prioridades Error, Critical y Alert… podemos usar el siguiente comando:

journalctl -p err..alert
o
journalctl -p 3..1

Limitando el espacio en disco

Por defecto journalctl almacena sus logs en /var/log/journal. Si no hemos configurado nada, limitará el almacenamiento al 10% del espacio total del sistema de archivos donde se encuentre dicho directorio.

Es decir, si /var/log/journal se encuentra en un filesystem de 50G, limitará el almacenamiento a 5G.

Si esto es demasiado para nosotros, podemos editar la configuración en /etc/systemd/journald.conf añadiendo esta opción:

SystemMaxUse=100M

Con esto estaremos limitando el almacenamiento a 100MiB.

Luego de esto será necesario reiniciar el servicio:

sudo systemctl restart systemd-journald.service

En otros artículos iremos ampliando la información para poder administrar correctamente un sistema systemd.

¡Espero que les haya gustado y les haya resultado útil!

¡Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!


Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador

3 comentarios

Jorge Schiariti · 18 agosto, 2016 a las 14:52

Qué bueno que está tu portal Diego !!!

    Diego Córdoba · 19 agosto, 2016 a las 01:35

    Muchas gracias Jorge!! 🙂

Diego Cordoba - @d1cor · 12 junio, 2017 a las 19:36

Fede! Quizás me expresé mal… la fecha siempre va acompañando a uno de estos parámetros, -since o -until, nunca sola… ahora, ĺo que quise decir, es que podés omitir el -since o -until para eliminar uno de los límites, con lo que, el comando podría quedar:
sudo journalctl -since -until #con los dos limites
sudo journalctl -until # solo con limite inicial
sudo journalctl -since # solo con límite final

Espero te aclare!

Los comentarios están cerrados.