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?
- Flexibilidad:
loggingEl módulo te permite configurar el nivel, formato y ubicación de salida de los registros según sea necesario. - Extensibilidad: puedes enviar fácilmente los registros a diferentes destinos como archivos, consola, red, etc.
- Registros estructurados:
loggingEl módulo admite el registro estructurado de logs, lo que facilita el análisis y procesamiento posterior. - Optimización del rendimiento: en comparación con
printen 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
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
3. Registrar logs
Después de configurar el nivel de registro, puedes utilizar los siguientes métodos para registrar logs:
Ejemplo
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
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
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.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
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
handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)
Atributos y métodos comunes del módulo logging
1. Clases principales
| Clase | Descripción | Ejemplo |
|---|---|---|
logging.Logger | Registrador, utilizado para emitir mensajes de registro (a través delogging.getLogger(name)obtener) | logger = logging.getLogger("my_logger") |
logging.Handler | Manejador, determina la ubicación de salida de los registros (como archivos, consola, etc.) | handler = logging.FileHandler("app.log") |
logging.Formatter | Formateador, controla el formato de salida de los registros | formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') |
logging.Filter | Filtro, utilizado para un control más preciso del registro | filter = logging.Filter("module.name") |
2. Métodos comunes del objeto Logger
| Método | Descripción | Ejemplo |
|---|---|---|
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 DEBUG | logger.debug("调试信息") |
logger.info(msg) | Registrar logs de nivel INFO | logger.info("程序启动") |
logger.warning(msg) | Registrar logs de nivel WARNING | logger.warning("磁盘空间不足") |
logger.error(msg) | Registrar logs de nivel ERROR | logger.error("操作失败") |
logger.critical(msg) | Registrar logs de nivel CRITICAL | logger.critical("系统崩溃") |
logger.addHandler(handler) | Agregar un manejador | logger.addHandler(handler) |
logger.addFilter(filter) | Agregar un filtro | logger.addFilter(filter) |
3. Tipos comunes de Handler
| Tipo de Handler | Descripción | Ejemplo |
|---|---|---|
StreamHandler | Envía a un flujo (como la consola) | handler = logging.StreamHandler() |
FileHandler | Envía a un archivo | handler = logging.FileHandler("app.log") |
RotatingFileHandler | Divide los registros por tamaño de archivo | handler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3) |
TimedRotatingFileHandler | Divide los registros por tiempo | handler = logging.TimedRotatingFileHandler("app.log", when="midnight") |
SMTPHandler | Envía registros por correo electrónico | handler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log") |
4. Niveles de registro (constantes)
| Nivel | Valor | Descripción |
|---|---|---|
CRITICAL | 50 | Error grave, el programa puede no poder continuar ejecutándose |
ERROR | 40 | Error, pero el programa aún puede ejecutarse |
WARNING | 30 | Mensaje de advertencia (nivel predeterminado) |
INFO | 20 | Información de ejecución del programa |
DEBUG | 10 | Información de depuración |
NOTSET | 0 | Hereda el nivel del registrador padre |
5. Campos de formato comunes de Formatter
| Campo | Descripción | Salida de ejemplo |
|---|---|---|
%(asctime)s | Hora de creación del registro | 2023-01-01 12:00:00,123 |
%(levelname)s | Nombre del nivel de registro | INFO |
%(message)s | Contenido del mensaje de registro | El programa se inició correctamente |
%(name)s | Nombre del registrador | my_logger |
%(filename)s | Nombre del archivo que genera el registro | app.py |
%(lineno)d | Número de línea donde se genera el registro | 42 |
%(funcName)s | Nombre de la función que genera el registro | main |
6. Métodos de configuración rápida
| Método | Descripción | Ejemplo |
|---|---|---|
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ízfilename: envía a un archivofilemode: modo de archivo (por ejemplo,'w'sobrescritura)format: cadena de formatodatefmt: formato de fecha (por ejemplo,"%Y-%m-%d %H:%M:%S")
Ejemplo
1. Configuración básica
Ejemplo
# 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
# 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)