El módulo logging de Python es una herramienta estándar diseñada para registrar eventos de una aplicación de manera flexible y segura para hilos (thread-safe). Permite categorizar mensajes por niveles de severidad y dirigirlos a múltiples destinos simultáneamente.
Configuración básica para archivos individuales
Para casos sencillos, el método basicConfig permite establecer una salida rápida hacia un archivo físico. Es ideal para scripts pequeños o prototipos.
import logging
# Configuración inicial del sistema de registros
logging.basicConfig(
filename='registro_actividad.log',
level=logging.DEBUG,
format='%(asctime)s | %(levelname)s | %(module)s | %(message)s',
datefmt='%d/%m/%Y %I:%M:%S %p'
)
logging.debug("Mensaje de depuración detallado")
logging.info("Evento informativo del sistema")
logging.warning("Advertencia detectada")
logging.error("Se ha producido un error")
logging.critical("Fallo crítico en la aplicación")
Encapsulamiento mediante una Clase de Registro
En aplicaciones más robustas, es preferible encapsular la lógica de registro. El siguiente ejemplo utiliza un RotatingFileHandler para gestionar el tamaño del archivo y evitar que el almacenamiento se agote.
import logging
from logging.handlers import RotatingFileHandler
class GestorLogs:
def __init__(self, nombre_archivo, nivel=logging.INFO):
self.logger = logging.getLogger(nombre_archivo)
self.logger.setLevel(nivel)
# Definición de rotación: 50MB por archivo, máximo 5 archivos de respaldo
manejador = RotatingFileHandler(
nombre_archivo,
maxBytes=50*1024*1024,
backupCount=5
)
# Estructura del mensaje
esquema = logging.Formatter(
'%(asctime)s - [%(levelname)s] - %(name)s - %(message)s'
)
manejador.setFormatter(esquema)
if not self.logger.handlers:
self.logger.addHandler(manejador)
def registrar(self, texto):
self.logger.info(texto)
# Ejemplo de uso
if __name__ == "__main__":
servicio_log = GestorLogs("app_principal.log")
try:
servicio_log.registrar("Iniciando procesos de backend...")
except Exception as e:
servicio_log.logger.error(f"Error inesperado: {e}")
Niveles de registro
El sistema de prioridades permite filtrar qué mensajes se guardan según la importancia del evento. Un mensaje solo se procesará si su nivel es igual o superior al configurado en el logger.
- CRITICAL (50): Errores graves que impiden la ejecución.
- ERROR (40): Fallos que afectan una funcionalidad específica.
- WARNING (30): Indicaciones de algo inesperado o problemas potenciales.
- INFO (20): Confirmación de que las cosas funcionan como se espera.
- DEBUG (10): Información detallada para diagnóstico técnico.
Gestión de múltiples destinos
Es común necesitar que los logs se guarden en archivos distintos depandiendo de su origen o propósito. Esto se logra creando instancias independientes de Logger.
# Configuración para logs de base de datos
manejador_db = logging.FileHandler('db_ops.log')
formato_db = logging.Formatter('%(name)s - %(message)s')
manejador_db.setFormatter(formato_db)
logger_db = logging.getLogger('BaseDatos')
logger_db.addHandler(manejador_db)
logger_db.setLevel(logging.WARNING)
# Configuración para logs de acceso web
manejador_web = logging.FileHandler('acceso_web.log')
logger_web = logging.getLogger('ServidorWeb')
logger_web.addHandler(manejador_web)
logger_web.setLevel(logging.INFO)
# Registro de eventos por separado
logger_db.error("Fallo de conexión en el pool")
logger_web.info("Usuario 'admin' ha iniciado sesión")
Rotación basada en tiempo
Cuando el volumen de datos es alto, es útil rotar los archivos cada cierto periodo (diariamente, por ejemplo) en lugar de por tamaño.
import logging
from logging.handlers import TimedRotatingFileHandler
def crear_logger_temporal(nombre_log):
logger = logging.getLogger("MonitorTiempo")
logger.setLevel(logging.DEBUG)
# Rota cada medianoche y mantiene 30 días de historial
manejador = TimedRotatingFileHandler(
nombre_log,
when="midnight",
interval=1,
backupCount=30
)
formato = logging.Formatter('%(process)d - %(levelname)s - %(message)s')
manejador.setFormatter(formato)
logger.addHandler(manejador)
return logger
monitor = crear_logger_temporal("analisis_diario.log")
monitor.debug("Verificación de latencia completada")
Alertas mediante Correo Electrónico
Para incidentes críticos, el manejador SMTPHandler permite enviar notificaciones automáticas por email cuando ocurre un error de nivel ERROR o superior.
from logging.handlers import SMTPHandler
logger_alerta = logging.getLogger("AlertaEmail")
config_email = SMTPHandler(
mailhost=("smtp.servidor.com", 587),
fromaddr="sistema@empresa.com",
toaddrs=["admin@empresa.com"],
subject="CRITICAL ERROR: Fallo en Producción",
credentials=("usuario", "password"),
secure=()
)
logger_alerta.addHandler(config_email)
logger_alerta.error("El servicio de pagos no responde. Revisar de inmediato.")