syslog en Python: envía logs a Unix

Publicado el: 26/08/2026
Tempo de leitura: 4 minutos
Close-up of stacked logs showing natural textures and patterns, suitable for firewood or decor.

El módulo syslog envía mensajes directamente al logger del sistema Unix. En vez de gestionar un archivo propio, la aplicación entrega eventos al daemon, que puede filtrar, rotar, reenviar, retener e integrar mensajes con journald o rsyslog.

Esta interfaz es útil para servicios pequeños, scripts de inicio, herramientas administrativas y componentes que necesitan logging del sistema sin configurar todo el framework logging. Aplicaciones grandes suelen beneficiarse de logging.handlers.SysLogHandler.

Disponibilidad

syslog existe en Unix, pero no en WASI ni iOS. Las facilities y opciones dependen del syslog.h de la plataforma.

try:
    import syslog
except ImportError:
    syslog = None

En Windows usa Event Log, archivos o un transporte remoto apropiado.

Enviar un mensaje

import syslog

syslog.syslog("Procesamiento iniciado")

Sin prioridad explícita, el nivel es LOG_INFO. Si openlog() no fue llamado, se abre automáticamente.

Prioridades

Los niveles incluyen LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO y LOG_DEBUG.

syslog.syslog(syslog.LOG_WARNING, "Cola cerca del límite")
syslog.syslog(syslog.LOG_ERR, "Fallo al guardar resultado")

No marques todo como crítico. La severidad exagerada oculta emergencias reales.

Facilities

Una facility clasifica el origen: LOG_USER, LOG_DAEMON, LOG_AUTH, LOG_MAIL y LOG_LOCAL0 a LOG_LOCAL7.

syslog.openlog(
    ident="mi-servicio",
    logoption=syslog.LOG_PID,
    facility=syslog.LOG_DAEMON,
)

Usa una facility local solo si la política del servidor la reserva para la aplicación.

Facility en la prioridad

Combina facility y nivel con OR bit a bit.

prioridad = syslog.LOG_LOCAL0 | syslog.LOG_NOTICE
syslog.syslog(prioridad, "Configuración recargada")

Si no se incluye facility, se usa la de openlog().

Identificación

ident se antepone al mensaje. Por defecto viene de sys.argv[0].

Elige un identificador estable y corto. No incluyas datos de usuario, rutas temporales o secretos.

LOG_PID

LOG_PID añade el PID.

syslog.openlog("worker", syslog.LOG_PID, syslog.LOG_DAEMON)

Los PIDs se reutilizan. Añade request ID o job ID para correlación duradera.

Otras opciones

LOG_NDELAY abre la conexión inmediatamente. LOG_PERROR puede escribir también en stderr. LOG_CONS puede intentar el console.

Comprueba opciones con hasattr().

Cerrar y reiniciar

closelog() cierra y restaura valores internos.

try:
    syslog.openlog("job", syslog.LOG_PID, syslog.LOG_USER)
    syslog.syslog("Inicio")
finally:
    syslog.closelog()

No abras y cierres por cada mensaje en aplicaciones largas.

Máscara de prioridades

setlogmask() filtra niveles antes de enviarlos.

anterior = syslog.setlogmask(syslog.LOG_UPTO(syslog.LOG_INFO))
try:
    syslog.syslog(syslog.LOG_DEBUG, "Filtrado")
    syslog.syslog(syslog.LOG_INFO, "Enviado")
finally:
    syslog.setlogmask(anterior)

LOG_MASK() selecciona un nivel y LOG_UPTO() todos hasta un umbral.

Evitar log injection

Datos no confiables pueden contener newlines y caracteres de control.

def valor_seguro(valor):
    return str(valor).replace("\r", "\\r").replace("\n", "\\n")

syslog.syslog(syslog.LOG_INFO, f"usuario={valor_seguro(usuario)}")

Aplica también límites de tamaño y redacción de secretos.

Mensajes estructurados

Syslog clásico recibe texto. Puedes usar JSON compacto.

import json

mensaje = json.dumps(
    {"evento": "login", "resultado": "fallo", "ip": ip},
    ensure_ascii=False,
    separators=(",", ":"),
)
syslog.syslog(syslog.LOG_WARNING, mensaje)

Confirma que el pipeline preserve el payload.

Tamaño de mensajes

Daemons, sockets y forwarders pueden truncar mensajes grandes. No envíes un stack trace enorme en una línea.

Resume, incluye un ID y guarda detalles en otro sistema.

Encoding

La API recibe str. El encoding real depende de la implementación del sistema.

Usa Unicode válido y prueba acentos. Sistemas legacy pueden requerir escaping ASCII.

Fallos

Syslog puede fallar por configuración, permisos o socket ausente. Decide si el fallo debe afectar la tarea principal.

try:
    syslog.syslog(syslog.LOG_ERR, mensaje)
except OSError:
    escribir_fallback_seguro(mensaje)

El fallback no debe llamar de nuevo al mismo syslog.

Secretos

Nunca registres contraseñas, tokens, cookies, claves, strings de conexión completas, datos de pago o contenido confidencial.

Datos personales

Minimiza IPs, emails e identificadores. Aplica retención y acceso compatibles con la finalidad.

Subinterpretadores

Desde Python 3.12, openlog() y closelog() solo pueden llamarse en el intérprete principal. Un subintérprete puede usar syslog() después de abrir en el principal; si no, genera RuntimeError.

Nuevas facilities

Python 3.13 añade LOG_FTP, LOG_NETINFO, LOG_REMOTEAUTH, LOG_INSTALL, LOG_RAS y LOG_LAUNCHD cuando la plataforma las define.

Auditoría

syslog(), openlog(), closelog() y setlogmask() generan eventos de auditoría.

syslog o logging

El módulo nativo es directo y específico de Unix. logging ofrece filtros, formatters, handlers, jerarquía y tests más sencillos.

Para aplicaciones grandes usa logging.handlers.SysLogHandler.

SysLogHandler

import logging
from logging.handlers import SysLogHandler

logger = logging.getLogger("app")
handler = SysLogHandler(address="/dev/log")
logger.addHandler(handler)
logger.warning("Cola cerca del límite")

La ruta cambia por plataforma.

journald

En systemd, mensajes syslog pueden aparecer en el journal. Campos estructurados nativos requieren una biblioteca específica.

Containers

En containers suele ser mejor escribir JSON a stdout o stderr y dejar que el runtime recoja. Puede no existir socket syslog.

No montes /dev/log sin evaluar seguridad.

Fork

Después de fork, el hijo hereda estado. Reabre con ident propio si representa otro componente.

Rate limiting

Un loop de errores puede inundar logs. Aplica muestreo o agregación.

if contador % 100 == 1:
    syslog.syslog(syslog.LOG_WARNING, f"error_repetido veces={contador}")

Correlación

Incluye IDs opacos de request, job o sesión sin datos sensibles.

Verificación local

Envía un mensaje único y consulta journalctl o archivos en /var/log. El destino depende del daemon.

Tests automatizados

No dependas del syslog global del host. Encapsula el envío y usa un fake. Para integración, usa daemon dedicado.

Errores comunes

Los fallos frecuentes son registrar secretos, permitir newlines, inflar severidad, asumir facilities, enviar mensajes enormes, depender de /dev/log en container y usar syslog directo cuando logging sería más testable.

Conclusión

syslog conecta Python con el logger Unix. Usa ident estable, prioridades honestas, contenido limitado y sanitizado y fallback no recursivo.

Para aplicaciones complejas considera SysLogHandler o stdout estructurado. Consulta la documentación oficial de syslog y syslog(3).

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Contenido del artículo

    Artículos relacionados

    A CPU and RAM sticks displayed on a white surface, showcasing computer hardware components.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    resource en Python: límites de CPU y memoria

    Aprende resource en Python para medir CPU, pico de memoria y page faults, y limitar archivos, procesos, descriptors y address

    Ler mais

    Tempo de leitura: 5 minutos
    26/08/2026
    Close-up of a person using a metro card machine for public transport payment indoors.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    pty en Python: automatiza terminales Unix

    Aprende pty en Python para ejecutar y probar programas interactivos, controlar pseudo-terminales, EOF, resize, señales y timeouts.

    Ler mais

    Tempo de leitura: 5 minutos
    25/08/2026
    Detailed view of programming code in a dark theme on a computer screen.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    tty en Python: modos raw y cbreak

    Aprende tty en Python para modos raw y cbreak, lectura de teclas, secuencias, Unicode y restauración segura del terminal Unix.

    Ler mais

    Tempo de leitura: 5 minutos
    25/08/2026
    Laptop displaying code with reflection, perfect for tech and programming themes.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    termios en Python: control seguro del terminal

    Aprende termios en Python para modo canónico, echo, lectura de teclas, baud rate, colas, ventana y restauración segura del TTY.

    Ler mais

    Tempo de leitura: 5 minutos
    25/08/2026
    Multiple padlocks securing a green chain link fence, symbolizing safety and protection.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    fcntl en Python: locks y control de archivos

    Aprende fcntl en Python para locks, flags de descriptors, ioctl, pipes y control Unix, evitando buffers inválidos y corrupción de

    Ler mais

    Tempo de leitura: 5 minutos
    25/08/2026
    Close-up view of a computer screen displaying code in a software development environment.
    Python Avanzado
    Foto de perfil de Leandro Hirt da Academify

    readline en Python: historial y autocomplete

    Aprende readline en Python para historial, autocompletado, edición de línea, GNU Readline, libedit y prompts seguros en terminal.

    Ler mais

    Tempo de leitura: 5 minutos
    25/08/2026