Saltar a contenido

Registro en systemd trabajando con journalctl

En este artículo

En las distribuciones modernas de Linux (Ubuntu ≥ 16.04, Debian ≥ 8, RHEL/CentOS ≥ 7, Alma/Rocky ≥ 8), systemd no solo gestiona servicios, sino que también proporciona un registro centralizado a través de journald y la utilidad journalctl.

El registro de systemd recopila: - mensajes del kernel (dmesg), - registros de servicios como (nginx, sshd, docker, y otros), - flujos estándar stdout/stderr de demonios, - eventos de auditoría (si está integrado con auditd).

Nota

journald puede operar en paralelo con syslog (por ejemplo, rsyslog o syslog-ng): los registros pueden duplicarse. Sin embargo, journald a menudo reemplaza completamente el syslog clásico.

Inicio rápido: comandos principales

Tarea Comando
Ver todos los registros (con paginador) journalctl
Últimas 10 entradas journalctl -n
Seguir registros en tiempo real journalctl -f (análogo a tail -f)
Registros desde el último arranque journalctl -b
Registros para un servicio específico journalctl -u nginx
Registros del kernel journalctl -k
Espacio en disco utilizado por el registro journalctl --disk-usage

Hora y zonas horarias

Por defecto, journalctl muestra la hora local. Verifique que esté configurada correctamente:

timedatectl status

Compruebe la salida para líneas como:

Local time: Thu 2025-11-07 15:32:11 
Time zone: Europe/Paris (PAR, +0100)

Gestión de la zona horaria

# Listar todas las zonas horarias disponibles
timedatectl list-timezones


# Establecer (por ejemplo, para Berlín)
sudo timedatectl set-timezone Europe/Berlin

Ver registros en UTC

journalctl --utc           # siempre en UTC
journalctl -b --utc        # arranque actual, en UTC

Historial de arranques

Por defecto, los registros de arranques anteriores no se conservan (se almacenan solo en /run/log/journal/, que se borra al reiniciar). Para conservarlos, habilite el almacenamiento persistente:

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald

O edite la configuración manualmente:

sudo nano /etc/systemd/journald.conf

Descomente y modifique:

[Journal]
Storage=persistent

Trabajar con arranques

# Listar todos los arranques guardados
journalctl --list-boots


# Salida:
#  -2 abc123... Wed 2025-11-05 10:00:00 MSK—Wed 12:30:45 MSK
#  -1 def456... Thu 2025-11-06 09:15:22 MSK—Thu 18:44:10 MSK
#   0 xyz789... Fri 2025-11-07 08:20:05 MSK—running


# Registros del arranque anterior
journalctl -b -1


# Registros por ID de arranque
journalctl -b xyz789...

Filtrado de registros

Por tiempo

# Desde un punto especificado hasta ahora
journalctl --since "2025-11-07 14:00:00"


# Para un período
journalctl --since "2025-11-06" --until "2025-11-07 09:00:00"


# Palabras clave convenientes
journalctl --since today
journalctl --since yesterday
journalctl --since "2 hours ago"
journalctl --until now

Nota

Formatos admitidos: YYYY-MM-DD, YYYY-MM-DD HH:MM:SS, today, yesterday, 1 hour ago, 5min ago.


Por servicio (unidad)

# Registros de Nginx
journalctl -u nginx


# Con extensión .service (opcional pero correcto)
journalctl -u nginx.service


# Múltiples servicios a la vez
journalctl -u nginx -u php-fpm --since today


# Solo errores de nginx de las últimas 2 horas
journalctl -u nginx -p err --since "2 hours ago"

Por proceso, usuario, grupo

# Por PID (por ejemplo, proceso maestro de nginx)
journalctl _PID=12345


# Por UID de un usuario
journalctl _UID=33          # por ejemplo, www-data
journalctl _UID=$(id -u nginx)


# Listar todos los UIDs con entradas
journalctl -F _UID


# Similarmente para GID
journalctl -F _GID

Por nivel de prioridad (gravedad)

Nivel Código Descripción
emerg 0 El sistema es inutilizable
alert 1 Se requiere acción inmediata
crit 2 Errores críticos
err 3 Errores
warning 4 Advertencias
notice 5 Eventos significativos
info 6 Mensajes informativos
debug 7 Depuración

Ejemplos:

# Solo errores y superiores (err, crit, alert, emerg)
journalctl -p err


# Lo mismo mediante código numérico
journalctl -p 3


# Errores de Nginx para el arranque actual
journalctl -u nginx -p err -b


Formato de salida

Opciones principales

--no-pager       # salida a stdout (para grep, tee, redirección)
--no-full        # no truncar líneas largas (por defecto están truncadas)
-n 50            # últimas 50 entradas
-f               # seguir (vista en vivo de nuevas entradas)

Formatear la salida

Formatos (-o)**

Formato Uso
short (predeterminado) Estilo clásico de syslog
short-iso Hora en ISO 8601: 2025-01-07T15:30:45+03:00
short-precise Hora con microsegundos
cat Solo texto del mensaje (sin metadatos) — útil para scripts
json JSON, una entrada por línea (legible por máquina)
json-pretty JSON legible por humanos (para depuración/análisis)
verbose Todos los campos, incluidos los ocultos _SOURCE_REALTIME_TIMESTAMP, _BOOT_ID, etc.)

Ejemplos:

# JSON legible por humanos para nginx
journalctl -u nginx -o json-pretty --since today


# Solo texto del mensaje
journalctl -u nginx -p err -o cat


# Exportar a un archivo para análisis
journalctl -b -u docker --no-pager > docker_boot.log

Gestión del tamaño del registro

Tamaño actual

# --vacuum-size=100M
journalctl --vacuum-size=100M

Limpieza de registros

Por tamaño

# --vacuum-files=5
journalctl --vacuum-files=5

Por tiempo

# --vacuum-time=1d
journalctl --vacuum-time=1d

Nota

Sufijos admitidos: s, m, h, days, weeks, months, years.

Límites persistentes (en la configuración)

Edite /etc/systemd/journald.conf:

- SystemMaxUse=1G
+ SystemMaxUse=500M

Después de los cambios:

systemctl restart systemd-journald

Nota

Los cambios en journald.conf no afectan a los registros ya acumulados: utilice --vacuum-* para limpiar.

Técnicas avanzadas

Búsqueda por contenido (con grep)

journalctl -u nginx | grep "error"

Análisis de frecuencia de eventos

journalctl --since "2023-01-01" --until "2023-01-31" | grep "error" | wc -l

Exportación y copia de seguridad

journalctl -b -u docker --no-pager > docker_boot.log

Preguntas frecuentes

P: ¿Por qué journalctl no muestra registros de reinicios anteriores? R: Compruebe si Storage=persistent está habilitado y si existe /var/log/journal/. Sin esto, los registros se mantienen solo en la memoria RAM /run.

P: ¿Cómo deshabilito journald y vuelvo a rsyslog? R: No puede deshabilitar completamente journald (es parte de systemd), pero puede: - Redirigir los registros a rsyslog mediante /etc/systemd/journald.conf o utilizando systemd-journald con SystemMaxUse=0 para deshabilitar el registro. - O deshabilitar journald como fuente para rsyslog, dejando solo este último.

P: ¿Se pueden cifrar los registros? R: journald no admite cifrado de forma nativa. Para ello, utilice: - logrotate + gpg, - O sistemas SIEM de terceros (Graylog, ELK, Loki + Promtail).

question_mark
Is there anything I can help you with?
question_mark
AI Assistant ×