Módulo logging de Python

En programación, el registro de logs (logging) es una herramienta muy importante; nos ayuda a rastrear el estado de ejecución del programa, depurar errores y registrar información importante.

Python proporciona unloggingmódulo, dedicado específicamente a las tareas de registro de logs. En comparación con las simplesprintdeclaraciones,loggingel módulo es más flexible y potente, capaz de satisfacer las necesidades de registro en diferentes escenarios.

¿Por qué usar el módulo logging?

  1. Flexibilidad:loggingEl módulo te permite configurar el nivel, formato y ubicación de salida de los registros según sea necesario.
  2. Extensibilidad: puedes enviar fácilmente los registros a diferentes destinos como archivos, consola, red, etc.
  3. Registros estructurados:loggingEl módulo admite el registro estructurado de logs, lo que facilita el análisis y procesamiento posterior.
  4. Optimización del rendimiento: en comparación conprinten comparación,loggingel módulo está optimizado en rendimiento, adecuado para su uso en entornos de producción.

Uso básico del módulo logging

1. Importar el módulo logging

Primero, necesitamos importarloggingel módulo:

Ejemplo

import logging

2. Configurar el nivel de registro

El nivel de registro se utiliza para controlar el nivel de detalle de los registros.loggingEl módulo proporciona los siguientes niveles de registro:

  • DEBUG: información de depuración detallada, generalmente utilizada en la etapa de desarrollo.
  • INFO: información sobre el funcionamiento normal del programa.
  • WARNING: indica problemas potenciales, pero el programa aún puede funcionar normalmente.
  • ERROR: indica errores en el programa que provocan que algunas funciones no funcionen correctamente.
  • CRITICAL: indica errores graves que pueden provocar que el programa se bloquee.

Puedes configurar el nivel de registro con el siguiente código:

Ejemplo

logging.basicConfig(level=logging.DEBUG)

3. Registrar logs

Después de configurar el nivel de registro, puedes utilizar los siguientes métodos para registrar logs:

Ejemplo

logging.debug("Este es un mensaje de depuración")
logging.info("Este es un mensaje normal")
logging.warning("Este es un mensaje de advertencia")
logging.error("Este es un mensaje de error")
logging.critical("Este es un mensaje de error grave")

4. Formato de salida de los registros

Puedes, mediante elbasicConfigmétodo, personalizar el formato de salida de los registros. Por ejemplo:

Ejemplo

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

5. Enviar los registros a un archivo

De forma predeterminada, los registros se envían a la consola. Si deseas guardarlos en un archivo, puedes configurarlo así:

Ejemplo

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    filename="app.log"
)

Uso avanzado del módulo logging

1. Usar múltiples registradores

En proyectos grandes, es posible que necesites crear registradores independientes para diferentes módulos o componentes. Puedes hacerlo de la siguiente manera:

Ejemplo

logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)

# Crear un manejador de archivo
file_handler = logging.FileHandler("my_logger.log")
file_handler.setLevel(logging.DEBUG)

# Crear un manejador de consola
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# Configurar el formato de registro
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# Agregar el manejador al registrador
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# Registrar logs
logger.debug("Este es un mensaje de depuración")
logger.info("Este es un mensaje normal")

2. Filtros de registro

Puedes controlar qué registros deben registrarse mediante filtros. Por ejemplo:

Ejemplo

class MyFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR

logger.addFilter(MyFilter())

3. Rotación de registros

Cuando el archivo de registro es demasiado grande, se puede usarRotatingFileHandleroTimedRotatingFileHandlerpara implementar la rotación de registros:

Ejemplo

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)

Atributos y métodos comunes del módulo logging

1. Clases principales

ClaseDescripciónEjemplo
logging.LoggerRegistrador, utilizado para emitir mensajes de registro (a través delogging.getLogger(name)obtener)logger = logging.getLogger("my_logger")
logging.HandlerManejador, determina la ubicación de salida de los registros (como archivos, consola, etc.)handler = logging.FileHandler("app.log")
logging.FormatterFormateador, controla el formato de salida de los registrosformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
logging.FilterFiltro, utilizado para un control más preciso del registrofilter = logging.Filter("module.name")

2. Métodos comunes del objeto Logger

MétodoDescripciónEjemplo
logger.setLevel(level)Configurar el nivel de registro (por ejemplo,logging.DEBUG、logging.INFO)logger.setLevel(logging.DEBUG)
logger.debug(msg)Registrar logs de nivel DEBUGlogger.debug("调试信息")
logger.info(msg)Registrar logs de nivel INFOlogger.info("程序启动")
logger.warning(msg)Registrar logs de nivel WARNINGlogger.warning("磁盘空间不足")
logger.error(msg)Registrar logs de nivel ERRORlogger.error("操作失败")
logger.critical(msg)Registrar logs de nivel CRITICALlogger.critical("系统崩溃")
logger.addHandler(handler)Agregar un manejadorlogger.addHandler(handler)
logger.addFilter(filter)Agregar un filtrologger.addFilter(filter)

3. Tipos comunes de Handler

Tipo de HandlerDescripciónEjemplo
StreamHandlerEnvía a un flujo (como la consola)handler = logging.StreamHandler()
FileHandlerEnvía a un archivohandler = logging.FileHandler("app.log")
RotatingFileHandlerDivide los registros por tamaño de archivohandler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)
TimedRotatingFileHandlerDivide los registros por tiempohandler = logging.TimedRotatingFileHandler("app.log", when="midnight")
SMTPHandlerEnvía registros por correo electrónicohandler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log")

4. Niveles de registro (constantes)

NivelValorDescripción
CRITICAL50Error grave, el programa puede no poder continuar ejecutándose
ERROR40Error, pero el programa aún puede ejecutarse
WARNING30Mensaje de advertencia (nivel predeterminado)
INFO20Información de ejecución del programa
DEBUG10Información de depuración
NOTSET0Hereda el nivel del registrador padre

5. Campos de formato comunes de Formatter

CampoDescripciónSalida de ejemplo
%(asctime)sHora de creación del registro2023-01-01 12:00:00,123
%(levelname)sNombre del nivel de registroINFO
%(message)sContenido del mensaje de registroEl programa se inició correctamente
%(name)sNombre del registradormy_logger
%(filename)sNombre del archivo que genera el registroapp.py
%(lineno)dNúmero de línea donde se genera el registro42
%(funcName)sNombre de la función que genera el registromain

6. Métodos de configuración rápida

MétodoDescripciónEjemplo
logging.basicConfig()Configura de una vez el nivel de registro, el manejador y el formato (normalmente se llama al inicio del programa)logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')

Parámetros comunes:

  • level: establece el nivel del registrador raíz

  • filename: envía a un archivo

  • filemode: modo de archivo (por ejemplo,'w'sobrescritura)

  • format: cadena de formato

  • datefmt: formato de fecha (por ejemplo,"%Y-%m-%d %H:%M:%S")

Ejemplo

1. Configuración básica

Ejemplo

import logging

# Configurar el registro
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='app.log'
)

# Usar
logger = logging.getLogger("my_app")
logger.info("Inicio del programa")

2. Configuración compleja con múltiples manejadores

Ejemplo

import logging

# Crear el registrador
logger = logging.getLogger("my_module")
logger.setLevel(logging.DEBUG)

# Manejador de consola
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# Manejador de archivo
file_handler = logging.FileHandler("debug.log")
file_handler.setLevel(logging.DEBUG)

# Formatear
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# Agregar manejadores
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# Usar
logger.debug("Información de depuración")  # Solo escribir en el archivo
logger.warning("¡Advertencia!")  # Enviar a la consola y al archivo al mismo tiempo

3. División de registros

Ejemplo


from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "app.log", maxBytes=1e6, backupCount=3  # Cada archivo 1MB, conservar 3 copias de seguridad
)
logger.addHandler(handler)
Otras extensiones