Técnicas Avanzadas de Solución de Problemas con Systemd Journald
Soluciona problemas de registros del diario systemd con filtros de tiempo, selección de arranque, consultas de unidades, niveles de prioridad y exportaciones.
Técnicas Avanzadas de Solución de Problemas con Systemd Journald
Depurar un host Linux basado en systemd a menudo comienza en el diario. journalctl -xe puede mostrar fallos recientes, pero la solución de problemas real generalmente implica reducir los registros por arranque, rango de tiempo, unidad, prioridad, proceso o ejecutable.
Los ejemplos a continuación muestran cómo convertir un diario grande en una vista enfocada que puedas usar durante fallos de servicio, problemas de arranque y errores recurrentes del sistema.
Entendiendo el Diario: Estructura y Ubicación
El Diario systemd agrega registros del kernel, servicios del sistema y aplicaciones. A diferencia de los archivos syslog tradicionales, el Diario almacena registros en un formato binario indexado, lo que permite consultas sofisticadas a través de journalctl. Los registros generalmente se persisten en directorios como /var/log/journal/.
Conceptos clave a recordar:
- Registro Estructurado: Las entradas contienen campos de metadatos (como
_PID,_COMM,_SYSTEMD_UNIT) quejournalctlutiliza para filtrar. - Volátil vs. Persistente: Los registros pueden almacenarse solo en memoria (volátil) o escribirse en disco (persistente). La configuración predeterminada generalmente favorece la persistencia.
Técnicas Esenciales de Filtrado Avanzado
El poder de journalctl radica en su capacidad para reducir millones de entradas de registro. Aquí están los filtros avanzados más efectivos.
1. Filtrado Basado en Tiempo
Los rangos de tiempo son críticos al diagnosticar problemas transitorios o regresiones de rendimiento. Puedes especificar el tiempo usando formatos absolutos o anclas relativas.
A. Tiempo Relativo: Usa -S (desde) y -U (hasta) para especificaciones de tiempo relativo.
# Muestra registros de los últimos 30 minutos
journalctl --since "30 minutes ago"
# Muestra registros entre las 10:00 AM de ayer y ahora
journalctl -S yesterday -U now
# Muestra registros de un rango de tiempo específico (formato ISO 8601)
journalctl --since "2024-05-01 08:00:00" --until "2024-05-01 08:15:00"
B. Tiempo Basado en Arranque: Para analizar una secuencia de arranque problemática específica, usa la bandera -b.
# Muestra solo registros del arranque actual
journalctl -b
# Muestra registros del arranque anterior
journalctl -b -1
# Muestra registros del kernel del arranque anterior al último
journalctl -b -2 -k
2. Filtrado por Unidad y Servicio de Systemd
Para aislar registros pertenecientes a un servicio específico, usa la bandera -u o --unit. Esto es indispensable al solucionar problemas de servicios fallidos.
# Muestra todos los registros para el servicio del servidor web Apache
journalctl -u httpd.service
# Muestra registros para el servicio desde la última vez que se inició
journalctl -u nginx.service --since "start of job -1"
3. Filtrado por ID de Proceso (PID) y Nombre del Ejecutable
Cuando un proceso específico falla, pero no sabes inmediatamente qué servicio lo posee, filtrar por PID o el nombre del ejecutable (_COMM) es muy efectivo.
# Muestra registros relacionados con un ID de proceso específico (ej., PID 4589)
journalctl _PID=4589
# Muestra registros para todos los procesos llamados 'mysqld'
journalctl _COMM=mysqld
4. Filtrado por Nivel de Prioridad
Las entradas del diario tienen prioridades numéricas asignadas (0=emerg, 7=debug). Usa la bandera -p para filtrar por gravedad, lo que ayuda a suprimir la salida excesiva de depuración al buscar errores.
| Nivel de Prioridad | Palabra Clave | Valor Numérico |
|---|---|---|
| Emergencia | emerg | 0 |
| Alerta | alert | 1 |
| Crítico | crit | 2 |
| Error | err | 3 |
| Advertencia | warning | 4 |
| Aviso | notice | 5 |
| Información | info | 6 |
| Depuración | debug | 7 |
# Muestra solo errores críticos (nivel 2) y superiores para el sistema
journalctl -p crit
# Muestra todos los registros excepto mensajes de depuración
journalctl -p 6
Análisis de Fallos de Arranque y Mensajes del Kernel
Solucionar problemas de inicio del sistema requiere separar fallos de servicios en espacio de usuario de problemas de inicialización del kernel o hardware.
Aislamiento de Mensajes del Kernel (-k o --dmesg)
La bandera -k muestra solo mensajes del kernel (equivalente a ejecutar dmesg). Esto es crucial para identificar problemas relacionados con controladores de dispositivos, reconocimiento de hardware o fallos de inicialización temprana antes de que systemd cargue los servicios.
# Revisa todos los mensajes del kernel del arranque actual
journalctl -k
# Busca errores específicos de hardware en el registro del kernel del arranque anterior
journalctl -k -b -1 | grep -i "error"
Rastreo de Dependencias de Servicios
Cuando un servicio no se inicia, podría deberse a que una dependencia ascendente falló. Usa la visualización inversa (-r) combinada con el filtrado de unidades para ver la secuencia que lleva al fallo.
# Muestra registros para una unidad en orden cronológico inverso
journalctl -u my-app.service -r
Formateo Avanzado de Salida y Exportación
Para un análisis más profundo o compartir registros, modificar el formato de salida es esencial.
1. Visualización como JSON (-o json)
Para scripting o integración con herramientas externas de análisis de registros, se prefiere la salida JSON estructurada.
journalctl -u sshd.service -o json
2. Visualización como una Sola Línea (-o cat)
Para obtener una salida limpia y sin procesar sin marcas de tiempo ni metadatos (útil al canalizar directamente a otras herramientas como grep), usa el formato cat.
journalctl -u cron.service -o cat
3. Exportación de Registros
Para archivar o transferir registros, expórtalos a un archivo de texto estándar. Si necesitas campos de metadatos específicos, elige un formato de salida que incluya campos estructurados.
# Exporta todos los registros del arranque actual a un archivo de texto
journalctl -b > boot_log_$(date +%F).txt
# Exporta campos estructurados seleccionados para una unidad
journalctl -u mariadb.service -o json --output-fields=__REALTIME_TIMESTAMP,PRIORITY,_PID,_COMM,MESSAGE --since today > mariadb_recent.json
Mejores Prácticas para la Gestión del Diario
Gestionar el tamaño del Diario es crucial para evitar el agotamiento del espacio en disco, especialmente en sistemas con alto volumen de registros.
- Verificar Uso: Determina el consumo actual de disco del Diario:
journalctl --disk-usage - Limpiar Registros Antiguos: Limita el tamaño del Diario por tiempo o uso de disco usando comandos
vacuum:# Mantén solo registros de los últimos 7 días sudo journalctl --vacuum-time=7d # Reduce el uso de disco a un máximo de 500MB sudo journalctl --vacuum-size=500M
Usa los filtros del diario como una herramienta de reducción: elige primero el arranque, la ventana de tiempo, la unidad y la prioridad, luego cambia el formato de salida solo cuando necesites archivar o analizar el resultado.