Formateador de Logs en Python

Aditya Raj 30 enero 2023
  1. ¿Cuáles son los diversos niveles de registro en Python?
  2. ¿Qué es un controlador de registro de Python?
  3. ¿Qué es el formateador de registros de Python?
  4. Pasos para crear un formateador de registro de Python
  5. Conclusión
Formateador de Logs en Python

Utilizamos el registro para almacenar información sobre la ejecución de un programa. Cuando se ejecuta el software, se generan varias advertencias y, a veces, se producen errores. Los datos almacenados por el registro nos ayudan a identificar las causas del error. Este artículo discutirá cómo podemos usar un formateador de registros en Python para almacenar los datos de registro en un formato deseable.

¿Cuáles son los diversos niveles de registro en Python?

El nivel de registro se utiliza para identificar la gravedad de una advertencia o mensaje en un archivo de registro. En Python, tenemos seis niveles de registro: critical, error, warning, info, debug, y notset. El nivel critic tiene la prioridad más alta de estos, mientras que el nivel notset tiene la prioridad más baja. Por lo general, cuando creamos registros en un programa, los registros se imprimen en la salida estándar. Podemos imprimir un registro de errores usando el método error() en el módulo logging. Como se muestra a continuación, el método error() toma un mensaje de cadena y lo imprime en la salida estándar.

import logging

logging.error("This is a sample error message")

Producción :

ERROR:root:This is a sample error message

Del mismo modo, puede imprimir un registro de advertencia con el método warning(), un registro de depuración con el método debug(), un registro crítico con el método critical() y un registro info usando el método info() como se muestra a continuación.

import logging

logging.debug("This is a sample debug message")
logging.info("This is a sample info message")
logging.warning("This is a sample warning message")
logging.error("This is a sample error message")
logging.critical("This is a sample critical message")

Producción :

WARNING:root:This is a sample warning message
ERROR:root:This is a sample error message
CRITICAL:root:This is a sample critical message

En la salida, root es el nombre del registrador actual. También podemos definir registradores utilizando el método getLogger(). Además, puede observar que solo se imprimen los registros critical, error y warning mientras que el registro de debug e info no se imprimen.

Esto se debe a que el nivel de registro está fijado en el nivel warning. Cualquier registro por debajo del nivel warning, es decir, los registros info y debug no se imprimirán. Para imprimir estos registros, tendremos que establecer el nivel de registro a info. Para ello, utilizaremos el método setLevel() definido en el módulo logging.

El método setLevel() se invoca sobre un objeto logger. El objeto logger se crea utilizando el método getLogger() definido en el módulo logging. El método getLogger() toma una cadena como entrada. La cadena se asigna como el nombre del registrador. Después de establecer el nivel de registro en un nivel definido, se imprimirán todos los registros que tengan una prioridad superior a este nivel. El siguiente ejemplo muestra cómo funciona.

import logging

logger = logging.getLogger("myLogger")
logger.setLevel(logging.CRITICAL)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")

Producción :

This is a sample critical message

Aquí, solo se imprime el registro crítico, ya que hemos definido el nivel de registro en crítico. Además, puede ver que solo se imprime el mensaje y no el tipo de registro y la palabra clave root. Es porque hemos definido un registrador personalizado llamado myLogger utilizando la función getLogger(). Para imprimir el tipo de registro y el nombre del registrador, necesitamos usar un formateador de registros de python.

¿Qué es un controlador de registro de Python?

Simplemente imprimir un mensaje en el archivo de registro no nos dará información sobre los errores. Por lo tanto, debemos formatear los mensajes de registro para obtener la información requerida de los archivos de registro. Para ello, utilizamos diferentes formateadores y controladores de registros.

Puede pensar en los objetos del controlador como canales para enviar mensajes de registro a su destino específico. Hay diferentes tipos de objetos manejadores, como los objetos FileHandler y StreamHandler. El objeto FileHandler se crea utilizando el método FileHandler(). Como se muestra a continuación, toma un nombre de archivo como entrada y devuelve un objeto FileHandler.

fileHandler = logging.FileHandler("test_file.log")
logger.addHandler(fileHandler)

De manera similar, un objeto StreamHandler se crea utilizando el método StreamHandler(). Mientras que los objetos FileHandler dirigen los registros a un archivo específico, el objeto StreamHandler dirige los registros a un flujo específico. Cuando no pasamos ningún argumento de entrada al método StreamHandler(), dirige los registros al flujo de salida estándar. Puede crear un StreamHandler, como se muestra a continuación.

streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)

Después de crear un objeto controlador, agregamos el controlador al registrador utilizando el método addHandler(). El método addHandler() se invoca en un objeto logger, y toma un objeto controlador como argumento de entrada. Después de la ejecución del método addHandler(), el controlador se agrega al logger.

¿Qué es el formateador de registros de Python?

Se utiliza un formateador de registros en Python para configurar la estructura final y el contenido de los registros. Con un formateador de registro de Python, podemos incluir el name del registro, la hora, la date, la severidad, y otra información junto con el mensaje de registro usando el operador %.

Para definir el formato de un registro, usamos el método Formatter(). El método Formatter() toma una cadena que contiene diferentes atributos como asctime, name, levelname, etc. como argumento de entrada. Después de la ejecución, el método Formatter() devuelve un objeto Formatter.

formatter = logging.Formatter("%(asctime)s  %(name)s  %(levelname)s: %(message)s")

Aquí,

  • El atributo asctime indica el momento en que se crea el registro.
  • El atributo name denota el nombre del registrador utilizado para registrar la llamada.
  • El atributo levelname indica el nivel de registro del mensaje, como depuración, información, advertencia, error o crítico. Puede leer más sobre otros atributos de registro aquí.

Después de crear un objeto Formatter, establecemos el formato del registro utilizando el método setFormatter(). El método setFormatter() se invoca en un objeto controlador. Hemos utilizado un StreamHandler para imprimir los registros en la salida estándar de nuestro programa. Cuando se invoca en un objeto controlador, la función setFormatter() toma un objeto Formatter como argumento de entrada y establece el formato de registro en el controlador.

streamHandler.setFormatter(formatter)

Después de configurar el formato de los mensajes de registro, puede registrar los mensajes como lo hace normalmente y se enviarán al flujo de salida en el formato definido.

import logging

logger = logging.getLogger("myLogger")
streamHandler = logging.StreamHandler()
logger.addHandler(streamHandler)
formatter = logging.Formatter("%(asctime)s  %(name)s  %(levelname)s: %(message)s")
streamHandler.setFormatter(formatter)
logger.debug("This is a sample debug message")
logger.info("This is a sample info message")
logger.warning("This is a sample warning message")
logger.error("This is a sample error message")
logger.critical("This is a sample critical message")

Producción :

2021-12-28 02:33:42,933  myLogger  WARNING: This is a sample warning message
2021-12-28 02:33:42,933  myLogger  ERROR: This is a sample error message
2021-12-28 02:33:42,933  myLogger  CRITICAL: This is a sample critical message

Aquí puede ver que solo hemos registrado el mensaje utilizando el método warning(). El log se ha impreso en el formato que hemos definido mediante el método Formatter(). Contiene todos los detalles sobre el registro, como la fecha y la hora de creación del registro, el nombre del registrador y el tipo de registro. Ahora que hemos aprendido todo el proceso por partes, he mencionado el proceso paso a paso para crear un formateador de registro de Python para formatear las salidas de registro a continuación.

Pasos para crear un formateador de registro de Python

  • Crear un objeto registrador utilizando el método getLogger().
  • Crear un objeto FileHandler o StreamHandler usando el método FileHandler() o el método StreamHandler().
  • Agregue el objeto FileHandler o StreamHandler al registrador utilizando el método addHandler().
  • Cree un formateador de registro de python utilizando el método Formatter().
  • Aplicar el formateador usando el método setFormatter() en el objeto FileHandler o StreamHandler.

Conclusión

En este artículo, hemos discutido cómo funciona el registro en Python. También discutimos los controladores y formateadores de registros en Python. En este artículo, usamos el objeto StreamHandler y el formateador de registros para demostrar cómo funciona el formateo. Sin embargo, siempre debe usar el objeto FileHandler para crear registros porque siempre debemos almacenar los registros en archivos para examinarlos en busca de errores si sucede algo inesperado. Además, puede usar muchos otros atributos de registro proporcionados en este artículo para formatear los mensajes de registro para una mejor comprensión.

Autor: Aditya Raj
Aditya Raj avatar Aditya Raj avatar

Aditya Raj is a highly skilled technical professional with a background in IT and business, holding an Integrated B.Tech (IT) and MBA (IT) from the Indian Institute of Information Technology Allahabad. With a solid foundation in data analytics, programming languages (C, Java, Python), and software environments, Aditya has excelled in various roles. He has significant experience as a Technical Content Writer for Python on multiple platforms and has interned in data analytics at Apollo Clinics. His projects demonstrate a keen interest in cutting-edge technology and problem-solving, showcasing his proficiency in areas like data mining and software development. Aditya's achievements include securing a top position in a project demonstration competition and gaining certifications in Python, SQL, and digital marketing fundamentals.

GitHub

Artículo relacionado - Python Logging