--- title: "Cómo usar journalctl y configurar journald en Ubuntu 24.04" description: "Filtra logs por servicio, prioridad, fecha y arranque con journalctl, activa el guardado persistente de journald y limita el disco que ocupa en Ubuntu 24.04." category: "Monitoring Logging" language: es source: https://cubepath.com/es/docs/monitoring-logging/configuracion-de-journalctl-para-analisis-de-logs updated: 2026-09-25 --- # Cómo usar journalctl y configurar journald en Ubuntu 24.04 En los sistemas con systemd, el demonio `systemd-journald` recoge en un único sitio los mensajes del kernel, de los servicios y de syslog, y `journalctl` es la herramienta para consultarlos. En este tutorial aprenderás a filtrar esos logs por servicio, prioridad, fecha, arranque y texto en Ubuntu 24.04, y a configurar journald para que conserve el historial entre reinicios sin llenar el disco. ## Requisitos previos Para seguir esta guía necesitas: - Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath. Todo aplica también a Debian 12 y Rocky Linux 9, salvo lo indicado en el paso 5. - Un usuario no root con privilegios `sudo`. Los miembros de los grupos `adm` o `systemd-journal` pueden leer el journal sin `sudo`, pero en los ejemplos se usa `sudo` para que funcionen con cualquier usuario. ## Paso 1: Leer el journal Sin argumentos, `journalctl` muestra todo el journal desde la entrada más antigua, dentro de un paginador (`less`). Casi siempre te interesa lo más reciente, así que empieza con estas dos formas: ```bash sudo journalctl -n 50 --no-pager ``` `-n 50` muestra las 50 últimas líneas y `--no-pager` las imprime directamente en la terminal. Para seguir los mensajes nuevos en tiempo real, como con `tail -f`, usa `-f` y pulsa `Ctrl+C` para salir: ```bash sudo journalctl -f ``` Si lees un rango grande dentro del paginador, `-r` invierte el orden para ver primero lo más reciente, y `-e` salta directamente al final. ## Paso 2: Filtrar por servicio y por arranque El filtro que más usarás es `-u`, que muestra solo lo que ha escrito una unidad de systemd, incluidos los mensajes de systemd sobre ella (arranques, paradas, fallos): ```bash sudo journalctl -u ssh -n 20 --no-pager ``` En Ubuntu y Debian la unidad de OpenSSH se llama `ssh`; en Rocky Linux es `sshd`. Puedes repetir `-u` para ver varios servicios intercalados por orden temporal: ```bash sudo journalctl -u nginx -u php8.3-fpm --since today ``` Cada arranque del sistema tiene su propio identificador. Lista los arranques registrados: ```bash sudo journalctl --list-boots ``` ```output IDX BOOT ID FIRST ENTRY LAST ENTRY -2 5c1f0e8a0a2d4c1c9a3e0b7c2d9f1a11 Mon 2026-09-21 08:02:11 UTC Tue 2026-09-22 17:40:03 UTC -1 9e7b3d6a4f1c4e0d8b2a6c5d3e1f0a22 Tue 2026-09-22 17:41:25 UTC Wed 2026-09-23 23:10:47 UTC 0 2a4c6e8f0b1d4f3a9c7e5b3d1f2e4a33 Wed 2026-09-23 23:12:02 UTC Thu 2026-09-24 12:35:10 UTC ``` Con `-b` limitas la salida a un arranque: sin valor es el actual y `-b -1` el anterior. Es la forma más rápida de averiguar qué pasó justo antes de un reinicio inesperado: ```bash sudo journalctl -b -1 -n 50 --no-pager ``` Para ver solo los mensajes del kernel del arranque actual (equivalente a `dmesg`), usa `-k`: ```bash sudo journalctl -k -b --no-pager | tail -20 ``` > Nota: si `--list-boots` solo muestra el arranque `0`, el journal no se está guardando en disco. El paso 5 explica cómo activarlo. ## Paso 3: Filtrar por fecha y por prioridad `--since` y `--until` aceptan fechas absolutas (`"2026-09-24 10:00"`) y expresiones relativas como `yesterday`, `today`, `"1 hour ago"` o `"-30min"`: ```bash sudo journalctl -u nginx --since "2026-09-24 10:00" --until "2026-09-24 11:00" ``` ```bash sudo journalctl --since "30 min ago" --no-pager ``` Cada entrada lleva una prioridad de syslog, de `0` (`emerg`) a `7` (`debug`). Con `-p` muestras esa prioridad y todas las más graves, así que `-p err` incluye `err`, `crit`, `alert` y `emerg`: ```bash sudo journalctl -p err -b --no-pager ``` También puedes indicar un rango, por ejemplo solo avisos y errores: ```bash sudo journalctl -p warning..err --since today --no-pager ``` | Valor | Nombre | Uso típico | |---|---|---| | 0 | `emerg` | El sistema no es utilizable | | 3 | `err` | Errores de servicios | | 4 | `warning` | Avisos que conviene revisar | | 6 | `info` | Mensajes informativos normales | | 7 | `debug` | Depuración | ## Paso 4: Buscar texto y filtrar por campos `-g` (o `--grep`) filtra por una expresión regular sobre el mensaje. Es más rápido y más preciso que pasar la salida por `grep`, porque se combina con el resto de filtros. Por ejemplo, los intentos de acceso SSH con contraseña incorrecta de hoy: ```bash sudo journalctl -u ssh -g "Failed password|Invalid user" --since today --no-pager ``` Si el patrón está todo en minúsculas, la búsqueda ignora mayúsculas y minúsculas; en cuanto incluye alguna mayúscula, la distingue. Además de las unidades, cada entrada tiene campos estructurados que puedes usar como filtro con la sintaxis `CAMPO=valor`. Para descubrir qué campos tiene una entrada, muéstrala en formato detallado: ```bash sudo journalctl -u ssh -n 1 -o verbose --no-pager ``` Algunos filtros útiles: ```bash sudo journalctl -t sudo --since today --no-pager ``` `-t` filtra por identificador de syslog; aquí muestra cada comando ejecutado con `sudo`. Para filtrar por el ejecutable o por el proceso: ```bash sudo journalctl _COMM=cron --since today --no-pager sudo journalctl _PID=1234 --no-pager ``` Si indicas varios campos distintos, deben cumplirse todos a la vez; si repites el mismo campo, basta con que se cumpla uno de ellos. ### Elegir el formato de salida La opción `-o` cambia el formato. Los más útiles son: - `-o short-iso`: marca de tiempo ISO 8601, cómoda para comparar con otros sistemas. - `-o cat`: solo el mensaje, sin fecha ni host, ideal para copiar un error. - `-o json`: una entrada JSON por línea, lista para procesar con `jq` u otras herramientas. Por ejemplo, para exportar los errores de Nginx de las últimas 24 horas a un archivo de texto que puedas adjuntar a un ticket: ```bash sudo journalctl -u nginx -p err --since "24 hours ago" -o short-iso --no-pager > ~/nginx-errores.txt ``` ## Paso 5: Activar el almacenamiento persistente journald puede guardar el journal en memoria (`/run/log/journal`, se pierde al reiniciar) o en disco (`/var/log/journal`). Con el valor por defecto, `Storage=auto`, usa el disco solo si el directorio `/var/log/journal` existe. En Ubuntu 24.04 y Rocky Linux 9 ese directorio ya viene creado; en algunas imágenes mínimas de Debian no. Comprueba dónde se está guardando: ```bash ls -d /var/log/journal sudo journalctl --disk-usage ``` ```output /var/log/journal Archived and active journals take up 184.0M in the file system. ``` Para no depender de que exista el directorio, fija el modo persistente de forma explícita. En lugar de editar `/etc/systemd/journald.conf`, crea un archivo en el directorio de drop-ins, que no se toca en las actualizaciones: ```bash sudo mkdir -p /etc/systemd/journald.conf.d sudo nano /etc/systemd/journald.conf.d/10-persistente.conf ``` ```ini [Journal] Storage=persistent ``` Con `Storage=persistent`, journald crea `/var/log/journal` si no existe. Reinicia el servicio para aplicar el cambio y vuelca a disco lo que haya en memoria: ```bash sudo systemctl restart systemd-journald sudo journalctl --flush ``` Tras el próximo reinicio del servidor, `journalctl --list-boots` mostrará también los arranques anteriores. ## Paso 6: Limitar el espacio que ocupa el journal Por defecto, journald usa hasta el 10 % del sistema de archivos donde vive el journal (con un máximo de 4 GB) y deja libre al menos el 15 %. En un servidor pequeño conviene fijar límites propios. Crea otro drop-in: ```bash sudo nano /etc/systemd/journald.conf.d/20-retencion.conf ``` ```ini [Journal] SystemMaxUse=1G SystemKeepFree=2G SystemMaxFileSize=100M MaxRetentionSec=1month ``` Qué hace cada opción: - `SystemMaxUse=1G`: tamaño máximo total del journal en disco. - `SystemKeepFree=2G`: espacio que journald deja siempre libre en el sistema de archivos. - `SystemMaxFileSize=100M`: tamaño de cada archivo antes de rotarlo. Los archivos se borran enteros, así que archivos pequeños permiten ajustar mejor el límite. - `MaxRetentionSec=1month`: borra las entradas de más de un mes aunque quede espacio. Aplica la configuración y comprueba los valores efectivos: ```bash sudo systemctl restart systemd-journald sudo journalctl -u systemd-journald -n 3 --no-pager ``` ```output Sep 24 12:48:02 web01 systemd-journald[4321]: Journal started Sep 24 12:48:02 web01 systemd-journald[4321]: System Journal (/var/log/journal/2a4c6e8f0b1d4f3a9c7e5b3d1f2e4a33) is 184.0M, max 1.0G, 839.9M free. ``` La línea `max 1.0G` confirma que el límite está activo. ### Liberar espacio a mano Si necesitas espacio de inmediato, `--vacuum-size` y `--vacuum-time` borran archivos archivados hasta cumplir el criterio. Primero rota el archivo activo para que también pueda eliminarse: ```bash sudo journalctl --rotate sudo journalctl --vacuum-time=2weeks ``` ```output Deleted archived journal /var/log/journal/2a4c.../system@...journal (48.0M). Vacuuming done, freed 96.0M of archived journals from /var/log/journal/2a4c6e8f0b1d4f3a9c7e5b3d1f2e4a33. ``` O limita por tamaño: ```bash sudo journalctl --vacuum-size=500M ``` No hace falta programar esto con cron: con los límites del paso anterior, journald aplica la limpieza por sí mismo. ## Paso 7: Controlar servicios que escriben demasiado journald limita cuántos mensajes acepta de cada servicio: por defecto 10.000 mensajes cada 30 segundos. Si un servicio supera el límite, verás un aviso como este y los mensajes sobrantes se descartan: ```bash sudo journalctl -u systemd-journald -g "Suppressed" --no-pager ``` ```output Sep 24 13:02:11 web01 systemd-journald[4321]: Suppressed 3124 messages from nginx.service ``` Lo correcto suele ser reducir el nivel de log del servicio. Si necesitas conservar esos mensajes, puedes ajustar el límite solo para ese servicio con `LogRateLimitIntervalSec=` y `LogRateLimitBurst=` en su override (`sudo systemctl edit nombre_del_servicio`), en lugar de subirlo para todo el sistema: ```ini [Service] LogRateLimitIntervalSec=30s LogRateLimitBurst=50000 ``` ## Solución de problemas - **`No journal files were found`** o solo ves tus propios procesos: estás ejecutando `journalctl` sin permisos suficientes. Usa `sudo` o añade tu usuario al grupo `systemd-journal` o `adm`. - **El journal no conserva arranques anteriores**: revisa que exista `/var/log/journal` y que `Storage` no esté fijado a `volatile` en algún archivo de `/etc/systemd/journald.conf.d/`. Con `systemd-analyze cat-config systemd/journald.conf` ves la configuración combinada. - **Mensajes de archivos corruptos**: tras un apagado brusco, `sudo journalctl --verify` indica qué archivos están dañados. journald los aparta y sigue escribiendo en uno nuevo; puedes eliminarlos con `--vacuum-*` cuando ya no los necesites. ## Conclusión Ya sabes filtrar el journal por servicio, arranque, fecha, prioridad, texto y campos, exportar lo que necesitas y configurar journald para guardar el historial en disco con un tamaño y una antigüedad máximos. Con esto puedes investigar la mayoría de incidencias de un servidor sin instalar nada más. Como siguientes pasos puedes: - Enviar los logs de varios servidores a un punto central con `systemd-journal-remote` o con un agente como Vector o Promtail. - Configurar reinicios y avisos automáticos para tus servicios con systemd. - Revisar periódicamente `journalctl -p err -b` como parte del mantenimiento del servidor.