La llegada de systemd a la mayoría de distribuciones de GNU/Linux, como sistema de inicio reemplazando a init, ha supuesto una nueva manera de ver de los mensajes del sistema, como pueden ser los del kernel y los diferentes servicios o procesos.
Journalctl es ahora la herramienta más utilizada para acceder a los registros del sistema y en esta entrada vamos a ver como podemos echarles un vistazo sin morir en el intento, o lo que es lo mismo, aplicando unos cuantos filtros que nos permitirán separar el polvo de la paja.
Uso básico de journalctl
La forma básica de acceder a los registros del sistema es:
journalctl
que viene a equivaler al viejo “cat /var/log/messages” y nos permite acceder a todos los logs sin filtrar (en cualquier momento podemos salir de esa pantalla utilizando la tecla “q”)
Como pasa con el resto de comandos podemos redirigir la salida hacia un documento de texto
journalctl > mensajes.log
Si queremos seguir los mensajes en tiempo real añadimos el parámetro -f
journalctl -f
Filtrar la salida de logs por boots
Si habéis ejecutado alguno de los comandos anteriores os habréis dado cuenta que el número de mensajes es inmenso, así que vamos a filtrarlos por los diferentes procesos de arranque,que haya tenido nuestro ordenador.
Para ver la lista de todos los boots:
journalctl --list-boots
Para ver los logs del boot actual:
journalctl -b
Si necesitamos ver alguno de los anteriores tenemos dos opciones:
- Utilizamos simplemente una cuenta regresiva. Por ej para ver al anterior:
journalctl -b -1
y así sucesivamente:
journalctl -b -2
journalctl -b -3
- O elegimos usar la ID del boot, que nos aparecio al listar los procesos de arranque con “journal –list-boots”. Sería algo así:
journalctl _BOOT_ID=dfe74d5a9d384a88821ff8d24d64f81f[/sourcecode]
Ver los mensajes del kernel
Le añadimos el parámetro -k:
journalctl -k
Como suele pasar en la linea de comandos podemos combinar varios parámetros para afinar la búsqueda.
Aquí vemos los mensajes referidos al kernel durante el boot actual:
journalctl -k-b
Filtrar por número de entradas en el registro de logs
La opción predeterminada es ejecutar
journalctl -n
la cual nos proporciona los últimos 10 mensajes
Pero lo podemos cambiar, simplemente poniendo un número:
journalctl -n 50
Filtras los logs por ejecutables o programas
En este caso también tenemos varias formas de hacerlo, bien directamente con el ejecutable:
journalctl _COMM=NetworkManager
o especificando la ruta
journalctl /usr/sbin/NetworkManager
y como siempre tenemos la opción de filtrar con grep:
journalctl | grep NetworkManager
Mostrar la salida por PID
Filtramos mediante el número identificador del proceso (algo que podemos consultar con top o htop), en esta ocasión como veis en el ejemplo 2527 corresponde a Firefox:
journalctl _PID=2527
Especificar la salida por usuarios
La id de los usuarios la podéis encontrar ejecutando (obviamente sustituís la parte del nombre del usuario)
id nombre_del_usuario
y después seleccionáis la que corresponda (1000, 1001, 1002…)
journalctl _UID=1001
Filtrar la salida por servicios de systemd
Podemos ver los servicios que dependen de systemd, ejecutando:
systemctl list-units -t service --all
y si nos interesa uno en particular, estudiamos sus mensajes añadiendo el parámetro -u y el nombre del service, como en este ejemplo
journalctl -u dbus.service
Podemos hacer una búsqueda de varios servicios añadiendo el caracter “+” (equivale a un “or”) y ejecutando:
journalctl _SYSTEMD_UNIT=apparmor.service + _SYSTEMD_UNIT=dbus.service
Filtrar por fechas
Se utilizan los parámetros “–since” y “–until”, así como expresiones tipo “yesterday” “ago” o “today”. El formato de tiempo es habitualmente YYYY-MM-DD HH:MM:SS.
Algunos ejemplos:
- Ver los logs desde el día de ayer hasta hoy a las 02:00 horas.
journalctl --since 'yesterday' --until '02:00'
- un intervalo de fechas específico:
journalctl --since='2015-02-29 00:01' --until='2015-03-29 00:01'
- Todos los logs especificando la fecha en el formato que os comentaba anteriormente, y filtrando por el programa firefox
journalctl _COMM=firefox --since='2015-02-29 00:01' --until='2015-03-29 00:01'
- Lo mismo que el caso anterior pero en este caso filtrando por el servicio de sshd.service
journalctl -u sshd.service --since='2015-02-29 00:01' --until='2015-03-29 00:01'
- O simplemente ver lo que ha pasado en la última media hora:
journalctl --since '30 min ago'
Filtrar por la prioridad del mensaje
Los mensajes se clasifican en función de su prioridad en 7 niveles diferentes: “emerg” (0),”alert” (1), “crit” (2), “err” (3), “warning” (4), “notice” (5),”info” (6), y “debug” (7)
Para filtrarlos utilizamos el parámetro -p seguido del número correspondiente. En este ejemplo vemos los críticos:
journalctl -p 2
Mensajes de los discos duros
Puede ser interesante para descubrir problemas de funcionamiento en nuestras unidades de discos duros.
journalctl /dev/sda
Ver el espacio que están ocupando los diferentes logs
Ejecutamos el comando:
journalctl --disk-usage
En el caso de que ese valor fuera excesivo lo podemos limitar en el archivo /etc/systemd/journald.conf, pero ya que hablamos de espacio, como el post al final ha quedado demasiado largo, eso algo que (quizás) veremos en otra ocasión.
Fuente: lamiradadelreplicante