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).







