Formateador de Logs en Python
- ¿Cuáles son los diversos niveles de registro en Python?
- ¿Qué es un controlador de registro de Python?
- ¿Qué es el formateador de registros de Python?
- Pasos para crear un formateador de registro de Python
- Conclusión
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
oStreamHandler
usando el métodoFileHandler()
o el métodoStreamHandler()
. -
Agregue el objeto
FileHandler
oStreamHandler
al registrador utilizando el métodoaddHandler()
. -
Cree un formateador de registro de python utilizando el método
Formatter()
. -
Aplicar el formateador usando el método
setFormatter()
en el objetoFileHandler
oStreamHandler
.
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.
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