Automatización Linux, scripting Bash y herramientas para sysadmins

journalctl sin miedo: cómo encontrar errores en Linux sin volverte loco

#linux#systemd#journalctl#debugging

El día que grep /var/log/syslog dejó de funcionar

Cuando empecé con Linux, depuraba errores así:

tail -f /var/log/syslog | grep -i error

Funcionaba. Hasta que empecé a usar distros que ya no escriben syslog por defecto. systemd trajo journalctl y por años lo ignoré porque grep me era cómodo.

Error. journalctl es a grep lo que git es a copiar carpetas con fecha. Una vez que aprendes 5 filtros, no vuelves.

Lo básico: ver logs

# Todos los logs desde el boot actual
journalctl

# Solo los del boot actual (sin los anteriores)
journalctl -b

# Con explicaciones ampliadas (mensajes del kernel traducidos)
journalctl -x

El flag -x es oro. Convierte mensajes crípticos tipo ata1.00: failed command: READ FPDMA QUEUED en “tu disco SATA está muriendo, haz backup ya”. Literal.

Filtrar por tiempo

El 90% de las veces que abro logs es porque algo falló “hoy” o “desde que reinicié”. No quiero ver logs de hace 3 semanas.

# Últimos 30 minutos
journalctl --since "30 min ago"

# Desde una fecha específica hasta ahora
journalctl --since "2026-06-01" --until "2026-06-02"

# Desde el último boot
journalctl -b

# Del penúltimo boot (si reiniciaste y quieres ver qué pasó antes)
journalctl -b -1

El -b -1 me salvó más de una vez. Servidor no bootea, fuerzas reinicio, arranca bien, pero necesitas saber por qué falló el boot anterior.

Filtrar por servicio

Esto es lo que grep no puede hacer bien:

# Solo logs de nginx
journalctl -u nginx

# De nginx, solo hoy
journalctl -u nginx --since today

# Con follow (como tail -f)
journalctl -u nginx -f

Y si no sabés el nombre exacto de la unidad:

systemctl list-units --type=service | grep -i algo

Filtrar por prioridad

Los logs tienen niveles: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7). Solo me interesan los errores:

# Solo errores y peores (0-3)
journalctl -p err

# Errores del servicio ssh, últimos 2 días
journalctl -u ssh -p err --since "2 days ago"

Buscar en mensajes

# Búsqueda como grep pero respetando el formato journal
journalctl -g "connection refused"

# Case insensitive
journalctl -g "out of memory" -i

-g usa expresiones regulares de Perl. Es más potente que grep porque entiende el formato binario del journal.

Kernel

# Solo mensajes del kernel (como dmesg)
journalctl -k

# Del boot actual
journalctl -k -b

Útil cuando metés un módulo raro y el kernel se queja.

Logs en formato exportable

A veces necesitas mandarle un log a alguien o procesarlo con un script:

# JSON (para scripts)
journalctl -u nginx --since today -o json

# JSON pretty (para leer)
journalctl -u nginx --since today -o json-pretty | head -50

Liberar espacio

El journal crece. Para ver cuánto ocupa:

journalctl --disk-usage

Para limitarlo:

# /etc/systemd/journald.conf
SystemMaxUse=500M

Y para borrar logs viejos sin tocar los recientes:

journalctl --vacuum-size=200M

En resumen: si todavía haces grep /var/log/..., dedícale 10 minutos a aprender estos 5 flags. -u, -b, --since, -p, -f. No necesitas más para el 95% de las debugging sessions.