Guía completa de logs en Python: de novato a experto

1. Guía completa del registro de logs en Python|Desde la depuración hasta la operación

En el desarrollo de programas usando Python, el registro de logs es muy importante para identificar errores y verificar el funcionamiento. En este artículo, se explicará, para principiantes de Python, cómo aprovechar eficazmente el registro de logs, desde conceptos básicos hasta técnicas avanzadas.

2. Qué es la salida de registro en Python? Conceptos básicos y su necesidad

La salida de registro es un mecanismo que registra la información y los errores que se generan durante la ejecución del programa. Al utilizar adecuadamente los registros, se obtienen los siguientes beneficios.

Beneficios de la salida de registro

  1. El análisis de errores se vuelve más fácil
    Ayuda a identificar la ubicación y la causa de los errores.
  2. Se puede rastrear el funcionamiento del programa
    Permite comprender qué partes funcionan correctamente y dónde se presentan anomalías.
  3. Se puede monitorizar la operación
    Sirve como base para monitorear continuamente el estado del sistema en el entorno de producción.

Diferencia con print()

La función print(), que los principiantes usan con frecuencia, es útil para depuración, pero tiene las siguientes limitaciones en desarrollo serio:

  • No se puede especificar de forma flexible el destino de salida (p.ej., archivos o servicios externos).
  • No se puede gestionar el nivel de registro (clasificación de importancia).

Al usar el módulo estándar logging de Python, se pueden resolver estos problemas.

侍エンジニア塾

3. Cómo comenzar a generar registros con el módulo logging estándar de Python

Python incluye de forma estándar el módulo logging, lo que permite generar registros fácilmente. En esta sección se explica el uso básico.

Resumen de los niveles de registro

En el módulo logging se pueden establecer «niveles de registro» que indican la importancia de los mensajes de registro. A continuación se presentan los niveles principales:

  • DEBUG: Información de depuración. Útil durante el desarrollo.
  • INFO: Mensaje informativo. Indica el del programa.
  • WARNING: Advertencia. Indica un problema potencial.
  • ERROR: Error. Indica que el programa no funciona correctamente.
  • CRITICAL: Error crítico. Indica un fallo del sistema.

Uso básico

A continuación se muestra un ejemplo sencillo de generación de registros con el módulo logging.

import logging

# Configuración básica del registro
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Ejemplo de salida para cada nivel de registro
logging.debug('Esto es información de depuración。')
logging.info('Esto es un mensaje informativo。')
logging.warning('Esto es un mensaje de advertencia。')
logging.error('Esto es un mensaje de error。')
logging.critical('Esto es un mensaje de error crítico。')

Explicación del código

  • basicConfig: Configura la salida de registro. Con el argumento level se puede especificar el nivel mínimo de registro a emitir.
  • Especificación de formato: Con el argumento format se puede personalizar el formato de los mensajes de registro.
  • Ejemplo: %(asctime)s es la marca de tiempo, %(levelname)s es el nivel de registro, y %(message)s representa el contenido del mensaje.

4. Cómo enviar logs a archivos y consola en Python

Los logs no solo pueden mostrarse en pantalla, sino también guardarse en archivos o sistemas externos. En esta sección se explica cómo configurar los diferentes destinos de salida.

Salida de logs a la consola

logging En la configuración predeterminada del módulo, los logs se envían a la consola.

import logging

logging.basicConfig(level=logging.INFO)
logging.info('Ejemplo de salida de log a la consola')

Salida de logs a archivo

Para registrar logs en un archivo, especifique el argumento filename de basicConfig.

import logging

logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
logging.info('Este es un ejemplo de salida de registro a un archivo.')

Salida de logs tanto a consola como a archivo

Si configura varios destinos de salida, use los handlers de logging.

import logging

# Creación del logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# Handler para consola
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# Handler para archivo
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)

# Configurar el formato del handler
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# Añadir handlers al logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.info('Ejemplo de log que se muestra en consola y archivo.')

5. Técnicas efectivas de registro de logs en proyectos Python

Aquí se presentan las mejores prácticas de registro de logs útiles en proyectos reales. Aprenda métodos para depurar de manera eficiente y mejorar la gestión de logs.

Configuración de logs coherente

En proyectos a gran escala, una configuración de logs coherente es importante. Al trabajar con varios módulos y miembros del equipo, establecer un formato y nivel de log unificado facilita el análisis y la solución de problemas.

A continuación se muestra un ejemplo de configuración de logs coherente.

import logging

# Función de configuración de registro común
def setup_logger(name, log_file, level=logging.INFO):
    handler = logging.FileHandler(log_file)
    handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)
    return logger

# Creación de registradores para cada módulo
app_logger = setup_logger('app_logger', 'app.log')
db_logger = setup_logger('db_logger', 'db.log')

# Ejemplo de salida de registro
app_logger.info('Mensaje de registro de la aplicación')
db_logger.error('Mensaje de error de la base de datos')

Manejo de errores y registro de logs combinados

En el manejo de errores (excepciones), registrar los logs adecuadamente permite comprender rápidamente los detalles del problema.

A continuación se muestra un ejemplo de registro de logs al producirse una excepción.

import logging

logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    # Código de ejemplo que genera un error
    1 / 0
except ZeroDivisionError as e:
    logging.error(f'Se produjo un error de división por cero: {e}')

Mensajes de log con información de contexto

Según la situación del proyecto, incluir información de contexto adicional (por ejemplo: ID de usuario, ID de transacción, etc.) en los mensajes de log permite un análisis más detallado.

import logging

logging.basicConfig(filename='context.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

user_id = 12345
transaction_id = 'txn_001'

logging.info(f'Usuario ID: {user_id}, ID de transacción: {transaction_id} - La operación fue exitosa.')

Filtrado adecuado de logs

Cuando se generan grandes volúmenes de logs, es eficaz usar filtrado para emitir solo los logs necesarios. A continuación se muestra un ejemplo de filtro personalizado.

import logging

class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG

logger = logging.getLogger('filtered_logger')
handler = logging.StreamHandler()
handler.addFilter(DebugFilter())

logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('Este es un registro de depuración.')
logger.info('Esto no se mostrará.')

6. Recomendaciones de 3 bibliotecas para mejorar la salida de logs en Python

Además del módulo estándar de Python logging, existen bibliotecas de logs convenientes. En esta sección, se presentan tres bibliotecas especialmente populares.

Loguru: Biblioteca de logs simple para principiantes

Características

  • Instalación y configuración sencillas.
  • Sintaxis más intuitiva que el logging estándar.

Instalación

pip install loguru

Uso básico

from loguru import logger

logger.info('Esto es una salida de registro usando Loguru.')
logger.error('También se pueden registrar mensajes de error fácilmente.')

Logzero: Biblioteca de logs ligera y fácil de usar

Características

  • Fácilmente personalizable.
  • Incluye función de rotación de logs.

Instalación

pip install logzero

Uso básico

from logzero import logger

logger.info('Salida de registro usando Logzero')
logger.warning('Este es un mensaje de advertencia.')

Structlog: Biblioteca especializada en logs estructurados

Características

  • Capacidad de generar logs en formato JSON fácilmente.
  • Adecuado para sistemas distribuidos y entornos en la nube.

Instalación

pip install structlog

Uso básico

import structlog

logger = structlog.get_logger()
logger.info('event', user='12345', action='login')

7. ¡Resuelve las dudas sobre la salida de logs en Python!

Q1. ¿Cuál es la causa cuando los registros no se generan?

Respuesta
Verifique que el nivel de registro esté configurado correctamente. De forma predeterminada, solo se pueden registrar los mensajes con nivel WARNING o superior.

Q2. ¿Qué hacer si el tamaño del archivo de registro se vuelve demasiado grande?

Respuesta
Al usar RotatingFileHandler, puede rotar el archivo de registro cada cierto tamaño.

Q3. ¿Cómo elegir bibliotecas de terceros?

Respuesta
Seleccione según el tamaño y los requisitos del proyecto. Para proyectos pequeños, Loguru es adecuado; si necesita registros estructurados, Structlog es apropiado.

8. Domina la salida de logs en Python para mejorar la eficiencia del desarrollo

En este artículo, explicamos desde los conceptos básicos de la salida de logs en Python hasta técnicas avanzadas y bibliotecas de terceros útiles. Al realizar una salida de logs adecuada, puedes mejorar significativamente la eficiencia de depuración y la precisión del monitoreo del sistema. ¡Inténtalo a partir de hoy!

侍エンジニア塾