Breaking

Post Top Ad

Your Ad Spot

viernes, 5 de julio de 2019

Conceptos básicos de registro de Python

Introducción

El registro le ayuda a realizar un seguimiento de los eventos que ocurren durante la ejecución de su código, que luego se pueden utilizar en el futuro para fines de depuración. Proporciona una mejor imagen del flujo de la aplicación y ayuda a los desarrolladores a rastrear el origen de los errores que ocurren durante la ejecución de su código, mejorando así la capacidad de mantenimiento de la aplicación.
En Python, la biblioteca estándar de Python proporciona la mayoría de las funciones de registro básicas. Por lo tanto, puede agregar el registro a su aplicación fácilmente sin ninguna configuración adicional. El módulo de registro estándar permite al desarrollador escribir mensajes de estado en un archivo o en cualquier otra secuencia de salida.

El módulo de registro

El loggingmódulo está disponible de forma predeterminada en los entornos Python y proporciona un registrador predeterminado llamado "root". Define las funciones y clases que implementan la funcionalidad de registro.
La API de registro proporcionada por la biblioteca estándar le permite incluir sus propios mensajes en el registro de la aplicación, así como la integración con mensajes de módulos de terceros. También proporciona un mecanismo para anotar los mensajes de registro con la fuente, la marca de tiempo, la gravedad y otros metadatos, que ayudan en el análisis del registro.

Tipos de registro (niveles de registro)

Cada mensaje de registro está asociado con un nivel de gravedad, que es un número entero que se utiliza para señalar la criticidad de los eventos registrados. El módulo de registro tiene una función auxiliar para cada nivel de registro, que se nombran de acuerdo con el nivel de registro. A continuación, se muestra una lista de los niveles de registro junto con su uso recomendado.
  • Depurar ( logger.debug): Proporcionar salida muy detallada. Se utiliza para diagnosticar problemas.
  • Info ( logger.info): Proporciona información sobre la ejecución exitosa. Confirma si las cosas están funcionando como se espera.
  • Advertencia ( logger.warnlogger.warning): emita una advertencia con respecto a un problema que podría ocurrir en el futuro o un error recuperable.
  • Error ( logger.error): indica un problema en el software ya que no se ejecuta como se esperaba.
  • Crítico ( logger.critical): indica un error grave que podría detener la ejecución del programa.
De forma predeterminada, el registrador raíz está configurado para informar todos los mensajes en el nivel de Advertencia o por encima de este: todos los mensajes por debajo de este nivel se filtran. Sin embargo, es posible configurar el módulo explícitamente para que sea más o menos selectivo en el filtrado.
Para agregar el registro a una secuencia de comandos de Python, solo importe el módulo usando import logging, y después de una importación exitosa, la secuencia de comandos puede registrar mensajes usando los logging.*métodos, tales como logging.debug().
Aquí puede ver un ejemplo simple del módulo de registro en acción:
import logging  
logging.warning("Caution: This is the root logger!")  
Salida:
WARNING:root:Caution: This is the root logger!  

Objetos Logger

El loggingmódulo permite al usuario crear múltiples objetos de registrador. Se pueden usar diferentes tipos de objetos de registrador para obtener un control preciso sobre cómo las diferentes partes de una aplicación de Python registran sus mensajes; por ejemplo, la aplicación principal de Python puede usar el rootregistrador, mientras que las bibliotecas de terceros utilizadas desde esta aplicación pueden usar sus propios objetos logger con sus propias configuraciones.
Mientras se utiliza el valor predeterminado rootfunciones de registrador, podemos llamar a las funciones directamente, por ejemplo, logging.debug()Es posible configurar su propio registrador creando un objeto de la Loggerclase, y esto puede ser útil si su aplicación tiene varios módulos.
Echemos un vistazo a algunas de las clases y funciones en el loggingmódulo. Las clases básicas y sus funciones son las siguientes:
  • Registradores: expone la interfaz que utiliza la aplicación. Los objetos de esta clase se utilizan directamente para llamar a las funciones en la aplicación.
  • Manejadores: envían mensajes de registro a la ubicación adecuada en el software, como una consola de salida estándar, un archivo, a través de HTTP o incluso correo electrónico (a través de SMTP).
  • Filtros: proporciona un control preciso sobre la elección de los registros que se mostrarán.
  • Formateadores: especifica el diseño final de los registros, especificando los atributos que debe contener la salida.
De estos, los objetos de la Loggerclase son los más utilizados.
Para crear un nuevo registrador, podemos utilizar el logging.getLogger()método. En el siguiente script, registramos errores utilizando el rootregistrador, así como nuestro registrador personalizado my_logger.
import logging

my_logger = logging.getLogger("My Logger")  
logging.error("Error: Root Log")  
my_logger.error("Error: My Logger log")  
Salida:
ERROR:root:Error: Root Log  
ERROR:My Logger:Error: My Logger log  
Cada mensaje de registro no solo indicará la fuente, el objeto del registrador a través del cual se registró, sino que mostrará un mensaje basado en la configuración de ese objeto.
En las siguientes secciones, veremos las diversas opciones de configuración de los objetos del registrador.

Registro en un archivo frente a la salida estándar

Por defecto, los objetos del registrador envían los registros a la salida estándar. Puede utilizar el basicConfig()método para cambiar este y otros parámetros. A continuación se muestra una lista de parámetros para el basicConfigmétodo:
  • nivel: establece el registrador un nivel de gravedad. Cualquier mensaje por debajo de este nivel de severidad no será registrado.
  • nombre de archivo: el nombre del archivo donde se escriben los registros.
  • modo de archivo: el modo en que se abrirá el archivo especificado, si lo hubiera.
  • Formato: especifica el formato del mensaje de registro. Esta es una cadena con LogRecordatributos.
LogRecordel objeto contiene la información de los eventos que se registran, como el número de línea, la hora, el nombre del registrador, etc. Discutir el objeto LogRecord está fuera del alcance de este artículo, pero hay más información disponible aquí .
A continuación se muestra un resumen de los pasos a seguir para registrar eventos de registro en un archivo:
  1. Importar el módulo de registro.
  2. Configurar el registrador utilizando el basicConfigmétodo.
  3. Creando un objeto logger.
  4. Configuración del valor de umbral del registrador.
  5. Utilice los métodos de registro.
Esto se puede entender mejor con un ejemplo:
# Filename: test_logger.py

import logging

# Create a logger object
logger = logging.getLogger()

# Configure logger
logging.basicConfig(filename="test.log", format='%(filename)s: %(message)s', filemode='w')

# Setting threshold level
logger.setLevel(logging.DEBUG)

# Use the logging methods
logger.debug("This is a debug message")  
logger.info("For your info")  
logger.warning("This is a warning message")  
logger.error("This is an error message")  
logger.critical("This is a critical message")  
El script anterior creará un archivo "test.log". El archivo contendrá la siguiente información de registro:
test_logger.py: This is a debug message  
test_logger.py: For your info  
test_logger.py: This is a warning message  
test_logger.py: This is an error message  
test_logger.py: This is a critical message  

Fecha / Hora en los mensajes de registro

Para mostrar la fecha y la hora de la ocurrencia de un evento, puede usar %(asctime)sen su cadena de formato en la basicConfig()función. Por ejemplo:
import logging

logging.basicConfig(format='%(asctime)s %(message)s')  
logging.warning('is the time the Admin logged out.')  
Salida:
2018-12-17 10:52:15,463 is the time the Admin logged out.  
Si desea cambiar la forma en que aparece la fecha / hora, puede configurarla usando el datefmtparámetro del basicConfigmétodo.

Variables de registro

En aplicaciones del mundo real, necesitamos generar registros de acuerdo con los cambios dinámicos que ocurren en nuestra aplicación. Como se ve en el ejemplo anterior, los métodos de registro toman una cadena como un argumento. Además, podemos incluir variables y formatear la cadena con marcadores de posición y luego pasarla al método de registro. En tiempo de ejecución, el valor de las variables se mostrará en los mensajes de registro.
Aquí hay un ejemplo de eso usando formato de cadena:
import logging

status = "connection unavailable"  
logging.error("System reported: %s", status)  
Salida:
ERROR:root:System reported: connection unavailable  
Comenzando con Python 3.6 f-Strings se puede usar como una alternativa a los especificadores de formato de cadena, por lo que el código se puede leer fácilmente cuando hay varios parámetros. Usando f-strings puede especificar cualquier expresión de Python como parte del mensaje, se evalúan durante el tiempo de ejecución y el resultado se integrará en los mensajes de registro.
El ejemplo anterior se puede reescribir usando una f-string como:
import logging

status = "connection unavailable"  
logging.error(f'System reported: {status}')  

Registro de seguimientos de pila

La captura de trazas de pila en su aplicación también es compatible con el módulo de registro. Establecer el exc_infoparámetro en Truemientras se llaman las funciones de registro nos permite capturar la información de excepción. Al usar esta función, podemos obtener información sobre la excepción que se está manejando actualmente. La información es específica para el hilo actual y el marco de pila actual.
import logging

my_list = [1, 2]  
try:  
    print(my_list[3]) # Index out of range
except Exception as e:  
    logging.error("Caught Exception!", exc_info=True)
Salida:
ERROR:root:Caught Exception!  
Traceback (most recent call last):  
  File "index.py", line 5, in <module>
    print(my_list[3]) # Index out of range
IndexError: list index out of range  
En caso de que el marco de pila actual no maneje las excepciones, la información se obtendrá de su interlocutor (es decir, el marco de pila que llama) y así sucesivamente hasta que encuentre un marco de pila para manejar la excepción. El marco de pila tiene la información de la excepción manejada más recientemente.
Si la pila no tiene excepciones que se manejen, Nonese devuelve una tupla con valor. De lo contrario, la función devuelve el valor de type(el tipo de excepción que se maneja), el valor (parámetro de excepción) y el rastreo (el objeto de rastreo que encapsula la pila de llamadas donde se produjo la excepción originalmente).

Conclusión

El diseño del módulo de registro es muy práctico, ya que proporciona funciones de registro listas para usar que pueden agregar el registro básico a un proyecto pequeño. Se puede extender fácilmente utilizando objetos de registrador y sus ricas opciones de configuración para satisfacer las necesidades de las aplicaciones más exigentes. Además de los mensajes, el módulo de registro también se puede usar para registrar excepciones y acumular trazas. Esto concluye el tutorial básico sobre la implementación del registro en Python.

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Post Top Ad

Your Ad Spot

Páginas