- Journalctl centraliza y filtra registros de systemd por tiempo, unidad, prioridad y más.
- Permite salidas flexibles (JSON, ISO 8601, verbose) y seguimiento en tiempo real.
- Gestión de espacio con vacuum y límites en journald.conf para un control fino.
Cuando trabajas con Linux moderno, systemd y su diario centralizado son el pan de cada día para entender qué ocurre en la máquina. Y aquí entra en juego journalctl, la navaja suiza para consultar, filtrar y exportar esos registros con una velocidad y precisión que no tendrás con archivos planos dispersos.
Este tutorial reúne, paso a paso, todo lo esencial y lo avanzado de journalctl: desde ver el último arranque, filtrar por servicio, usuario o prioridad, hasta gestionar el espacio en disco, cambiar formatos de salida o exportar en JSON. Además, verás cómo habilitar el almacenamiento persistente, listar arranques previos y moverte por ventanas de tiempo con absoluta flexibilidad.
Journalctl, systemd-journald y por qué importa
En sistemas con systemd, los mensajes del kernel, servicios, initrd y procesos de usuario se recogen en un diario binario administrado por systemd-journald. A diferencia de /var/log/syslog y similares, este formato binario permite búsquedas rápidas, filtrado por metadatos y salidas versátiles (por ejemplo, JSON o estilo syslog), todo desde un único punto de acceso: journalctl.
Antes de nada: revisa la zona horaria
Como los registros se muestran en hora local por defecto, conviene validar primero la zona horaria con timedatectl. Puedes listar zonas disponibles con timedatectl list-timezones
y cambiarla con sudo timedatectl set-timezone ZONA
. Para revisar el estado, usa timedatectl status
y confirma que el reloj local es correcto.
Si te interesa trabajar en UTC, journalctl añade el modificador –utc para mostrar marcas temporales universales cuando lo necesites. Así no hay líos al comparar con registros de otros servidores o con datos de monitorización.
Primeros pasos: ver, navegar y paginar
Sin argumentos, journalctl
muestra todo el diario desde la entrada más antigua hasta la más reciente usando un paginador (normalmente less). Puedes desplazarte con flechas y, si la línea es más larga que la pantalla, ver el resto con la flecha derecha. Para invertir el orden (recientes primero), añade -r
.
Si quieres que se trunque la línea en vez de desplazarse lateralmente, usa --no-full
; y para ver absolutamente todo (incluidos caracteres no imprimibles), añade -a
. Cuando lo que quieres es procesar la salida con otras herramientas, --no-pager
desactiva el paginador y deja la salida en stdout.
Hay más atajos prácticos para el día a día: -e
salta directo al final del diario para ver lo último que ha pasado y -x
intenta añadir explicaciones útiles a algunos mensajes (cuando estén disponibles) para acelerar el diagnóstico.
Filtrar por arranques del sistema
El conmutador -b
te muestra solo las entradas del arranque actual. Verás líneas “– Reboot –” que delimitan sesiones si navegas por más de un arranque. Para ir a un arranque anterior, usa journalctl -b -1
; para hace cinco arranques, -b -5
. Esto es ideal cuando un problema solo ocurre tras un reinicio o en secuencias de boot concretas.
Si quieres la lista de arranques que conoce el diario, journalctl --list-boots
mostrará uno por línea con: desplazamiento relativo (0, -1, -2, …), BOOT_ID y rango temporal. Puedes consultar por desplazamiento o por ID absoluto: journalctl -b 0
o journalctl -b BOOT_ID
.
Importante: para que los arranques previos persistan entre reinicios, habilita almacenamiento persistente creando /var/log/journal
(sudo mkdir -p /var/log/journal
) o editando /etc/systemd/journald.conf con Storage=persistent
. Así no se perderán los registros en cada boot.
Ventanas temporales potentes
Para acotar por tiempo, usa --since
y --until
con el formato YYYY-MM-DD HH:MM:SS. Si omites la hora, se asume medianoche; si omites la fecha, se asume el día actual. Por ejemplo: journalctl --since "2024-12-01 09:00" --until "2024-12-01 12:00"
.
También puedes tirar de expresiones relativas: yesterday, today, tomorrow, now, o frases tipo "1 hour ago"
. Un clásico: journalctl --since 09:00 --until "1 hour ago"
para ver desde primera hora hasta la hora anterior a la actual.
Filtrar por servicio, procesos, usuarios y más
El filtro más habitual es por unidad de systemd: -u
. Por ejemplo, journalctl -u nginx.service
muestra todo lo del servicio nginx. Puedes combinar varias unidades para ver la interacción entre ellas, intercalando cronológicamente entradas de, por ejemplo, Nginx y PHP-FPM: journalctl -u nginx.service -u php-fpm.service --since today
.
Para servicios en ejecución o no, puedes listar unidades con systemctl list-units -t service --all
y descubrir nombres exactos (útil en sistemas con docenas de servicios). Así evitas typos y filtras justo lo que toca.
Si conoces el PID, filtra por _PID
: journalctl _PID=8088
. Para usuarios y grupos, utiliza _UID
y _GID
: por ejemplo, id -u www-data
devolverá el UID que luego podrás usar en journalctl _UID=33 --since today
para ver lo generado por ese usuario.
El diario indexa muchos campos de forma automática: ejecutable, comando, transporte, facility, etc. Con journalctl -F CAMPO
puedes listar los valores distintos de un campo y así construir filtros más certeros. Consulta man systemd.journal-fields
para ver el catálogo completo de campos filtrables.
Algunos filtros muy prácticos: por ruta de ejecutable (journalctl /usr/bin/bash
), por facility del estilo syslog (SYSLOG_FACILITY=3
corresponde a daemon), por ID de arranque (_BOOT_ID=...
) o por transporte (_TRANSPORT=kernel|stdout|journal|syslog|driver|audit
) según el origen del mensaje.
Incluso puedes filtrar por dispositivo en algunos casos, por ejemplo para detectar eventos USB en Linux o con journalctl /dev/sda
, útil para localizar mensajes relacionados con almacenamiento cuando hay sospechas de I/O o sectores defectuosos.
Mensajes del kernel y equivalentes a dmesg
Para ver exclusivamente los mensajes del kernel tienes -k
o --dmesg
. Por defecto, se limitan al arranque actual, pero puedes combinarlos con -b
para otros boots: journalctl -k -b -5
mostrará lo del kernel de hace cinco arranques.
Este filtro es muy útil para detectar conflictos de drivers, problemas de hardware o kernel panic o eventos de bajo nivel que no aparecen en los servicios de usuario. Es la alternativa moderna al viejo comando dmesg
con contexto temporal y metadatos.
Prioridades de log: del 0 al 7 o por nombre
Journalctl reconoce los niveles de prioridad estándar: 0 emergencia, 1 alerta, 2 crítico, 3 error, 4 advertencia, 5 aviso, 6 información, 7 depuración. Puedes filtrar con -p
usando el nombre o su número, y por defecto incluye el nivel elegido y todos los más severos.
Ejemplos: journalctl -p err -b
(error y más alto en el arranque actual) o journalctl -p 3
. Si quieres acotar un rango exacto, usa el formato desde..hasta
: por ejemplo, solo warning, error y crítico con journalctl -p warning..crit
o en números journalctl -p 4..2
.
Seguir en tiempo real, últimas líneas y búsquedas
Para “escuchar” el diario en vivo, -f
funciona igual que tail -f. Perfecto cuando reinicias un servicio y quieres ver de inmediato qué escupe. Si prefieres un muestreo, -n
enseña las últimas N líneas (por defecto 10): journalctl -n
, journalctl -n 20
o journalctl -n12
en su forma compacta.
Además del siempre útil pipe a grep, journalctl integra --grep
para patrones regex directamente en la consulta. Por ejemplo, para localizar entradas que contengan GnuPG: journalctl --grep GnuPG
. Combinado con tiempo, unidad o prioridad, la búsqueda es quirúrgica.
Formatos de salida y exportación
Con -o
cambias el formato de salida. Tienes short
(estilo syslog por defecto), short-iso
(timestamp ISO 8601), short-monotonic
(marca monotónica), short-precise
(microsegundos) y verbose (muestra todos los campos, incluidos los internos).
Para integraciones, json
y json-pretty
son ideales (este último es más legible para humanos), y json-sse
encapsula la salida para eventos enviados por servidor. El formato cat
imprime solo el campo MESSAGE
, útil para lecturas limpias, y export
sirve para transferir o respaldar registros en binario.
Si vas a procesar con otras herramientas, recuerda combinar --no-pager
y redirecciones: journalctl -b -u nginx -o json --no-pager > nginx.json
o simplemente journalctl > mensajes.log
cuando necesites un volcado rápido.
Permisos y seguridad
Por diseño, cada usuario puede consultar sus propios registros. Para ver los del sistema, se requiere ser root o pertenecer a grupos como adm
, wheel
o systemd-journal
. Esto evita filtraciones de información sensible y respeta el principio de mínimo privilegio.
Control del uso en disco
Para medir cuánto ocupa el diario: journalctl --disk-usage
. Verás un resumen con los MiB/GiB consumidos por los ficheros de journal en almacenamiento persistente y volátil, algo clave para evitar sustos en particiones pequeñas.
Si necesitas reducir o liberar espacio en Linux, tienes tres estrategias de vaciado: por tamaño, por tiempo y por número de archivos. Ejemplos: sudo journalctl --vacuum-size=1G
, sudo journalctl --vacuum-time=2weeks
o sudo journalctl --vacuum-files=10
para conservar como máximo 10 archivos archivados.
Para ajustar límites permanentes, edita /etc/systemd/journald.conf
. Las claves más útiles: SystemMaxUse=
y RuntimeMaxUse=
(límite total en persistente y volátil), SystemKeepFree=
y RuntimeKeepFree=
(espacio a reservar en el FS), SystemMaxFileSize=
y RuntimeMaxFileSize=
(tamaño de archivo individual) y SystemMaxFiles=
y RuntimeMaxFiles=
(número máximo de ficheros archivados). Los tamaños aceptan sufijos K, M, G, T, P, E.
Ten en cuenta que los límites de tamaño de archivo orientan la rotación para alcanzar el valor marcado y que, por defecto, si no configuras nada, journal suele autolimitarse a alrededor del 10% del sistema de archivos donde reside. Tras cambiar la configuración, reinicia el servicio con sudo systemctl restart systemd-journald
.
Recetas rápidas y trucos
Para ver solo errores y más graves del último arranque: journalctl -p err -b
. Si quieres exactamente warning, error y crítico: journalctl -p warning..crit
o journalctl -p 4..2
para expresarlo en números.
Listar todos los valores de un campo y afinar filtros: journalctl -F _GID
(o -F _UID
, -F _EXE
, etc.). Es perfecto para descubrir IDs reales antes de construir tu consulta final.
Separar por ejecutable o comando: journalctl _EXE=/usr/bin/sudo
o journalctl _COMM=sudo
. Si necesitas aislar lo que proviene de la salida estándar de servicios, filtra por _TRANSPORT=stdout
.
Filtrar por host en entornos con hostname compartido: journalctl _HOSTNAME=debian
. Y para pedir entradas de un usuario concreto sabiendo su UID: journalctl _UID=0
(root) o el número que corresponda a tu caso.
¿Necesitas ver solo mensajes a nivel “usuario” de la facility syslog? journalctl SYSLOG_FACILITY=1
(y recuerda que 3 corresponde a daemon). Estos filtros te ayudan a emular vistas clásicas de syslog cuando migras a systemd.
Trabajar en UTC, ISO 8601 y precisión de microsegundos
Si tienes sistemas en múltiples zonas o comparas con métricas, añade --utc
para estandarizar la hora. Para formatos claros y ordenables, -o short-iso
es una gran elección; si te interesa el orden por reloj monotónico (para depurar secuencias relativas), -o short-monotonic
es tu amigo.
Cuando un incidente requiere granularidad máxima, -o short-precise
añade microsegundos a la marca temporal. Es una joya al correlacionar con trazas, perfiles o capturas de red.
Buenas prácticas de uso diario
Activa persistencia si te importa el histórico: crea /var/log/journal
o configura Storage=persistent
y reinicia journald. Si trabajas con mucha rotación, define SystemMaxUse
y SystemKeepFree
para que nunca ahogue la partición.
Para depurar servicios, combina: -u servicio
+ -f
+ filtros de prioridad y tiempo. Añade -x
cuando sospeches de mensajes crípticos; a veces aporta pistas adicionales que te ahorran minutos valiosos.
En pipelines y exportaciones, usa --no-pager
y formatos como json
o export
según la herramienta de destino. No olvides la seguridad: restringe el acceso a grupos adecuados y revisa permisos si compartes salidas que puedan contener datos sensibles.
Dominar journalctl cambia la forma de entender el sistema: con filtros por unidad, PID, usuario, prioridad o tiempo, con salidas ricas y control del uso en disco, tendrás siempre a mano la historia precisa de lo que está pasando. Es una herramienta sólida para monitorizar, auditar y depurar con cabeza, sin perderte entre miles de líneas.
Redactor apasionado del mundo de los bytes y la tecnología en general. Me encanta compartir mis conocimientos a través de la escritura, y eso es lo que haré en este blog, mostrarte todo lo más interesante sobre gadgets, software, hardware, tendencias tecnológicas, y más. Mi objetivo es ayudarte a navegar por el mundo digital de forma sencilla y entretenida.