3

Programación concurrente y paralelismo [Modulo 1 - Threads] - [3. Logging]

Cuando hablamos de Python, es muy frecuente usar print en temas como el debug, para mostrar en consola información que nos pueda ser de interés. El caso cambia un poco cuando estamos trabajando con proyectos aun mas grande y que tambien maneje threads y procesos, en estos casos es mucho mejor usar el módulo logging.

Logging

El módulo logging nos ayuda a mostrar información por consola, pero con más características que el print. Lo primero que hay que saber es que tenemos diferentes tipos de mensaje y a cada uno se le asigna un nivel diferente. Los niveles nos ayudarán a identificar los mensajes que se nos muestran, también a saber cuáles niveles de mensajes deseamos ver.

Tipo mensajeNivel
Debug10
Info20
Warning30
Error40
Critical50
import logging

defmessages():
    logging.debug("This is a debug message")
    logging.info("This is an info message")
    logging.warning("This is a warning message")
    logging.error("This is an error message")
    logging.critical("This is a critical message")

if __name__=="__main__":
    messages()

De esta forma podremos imprimir cada uno de los tipos de mensajes. Sin embargo, si ejecutamos este fragmento de código, veremos el siguiente resultado:

iUd8xLGhb9.png

Como podemos ver, no se nos muestra los mensajes de tipo info ni debug, esto se debe a que por defecto, el módulo logging solo permite la visualización de los mensajes de nivel 30 o superior. Para cambiar estos valores debemos modificar la configuración base, la cual también nos permite modificar muchos más aspectos.

Configuración

para configurar el módulo logging, debemos usar el método basicConfig y luego indicar que queremos modificar, entre estas configuraciones tenemos:

ConfiguraciónDescripción
levelNivel mínimo desde el cual se va a imprimir.
formatFormato en el cual se imprime el mensaje.
datefmtFormato en el cual se va a mostrar la fecha (en caso de ser incluida en el formato)
filenameSi no es nulo, enviara las salidas a un archivo en lugar de mostrarlos por consola

Para el formato de texto, vamos a contar con algunas variables, las cuales cuentan con nombres específicos y debemos ubicar de la siguiente manera: %(variable_name)s .Si se llega a escribir texto sin esta estructura, se va a imprimir con normalidad.

Estas son algunas de las variables que podemos usar (para todos los siguientes artículos, se estará trabajando con las últimas 4 variables):

VariableDescripción
levelnameTipo de mensaje.
nameNombre del logging.
pathnameRuta del archivo.
filenameNombre del archivo.
asctimeFecha.
funcNameFunción que se está ejecutando.
messageMensaje personalizado
lineonLineal que se está ejecutando.
moduleModulo que se está ejecutando.
threadMuestra el thread que está funcionando.
threadNameMuestra el nombre del thread.
processMuestra el proceso que está funcionando.
processNameMuestra el nombre del proceso.

Ejemplos de formatos:

  • "[%(levelname)s] - %(asctime)s -> %(message)s "
  • “%(module)s | %(funcName)s | %(lineon)s -> %(message)s”
  • “%(process)s | %(processName)s | %(asctime)s -> %(message)s”
  • “%(message)s”
  • “%(levelname)s:%(name)s:%(message)s” ----> Este es el formato del mensaje por defecto.

Ahora veremos como se usa la configuración personalizada:

import logging

logging.basicConfig(
    level=logging.DEBUG,
    format=f'[%(levelname)s] | %(processName)s -  %(asctime)s -> %(message)s',
    datefmt='%H:%M:%S',
    #filename='messages.log'
)

defmessages():
    logging.debug("This is a debug message")
    logging.info("This is an info message")
    logging.warning("This is a warning message")
    logging.error("This is an error message")
    logging.critical("This is a critical message")

if __name__=="__main__":
    messages()

Como podremos ver, en el parámetro level usamos una constante, nosotros podemos enviar el número del nivel pero es mejor usar las constantes que nos provee el módulo logging.

Si ejecutamos este código, veremos que ahora si imprime todos los mensajes y, además, cambia el formato en el que se muestran los mismos.

4aO10dxkuy.png
Escribe tu comentario
+ 2
1
223Puntos

Hola!
Desearía saber de que curso son estas notas, porque lo he buscado y no encuentro el curso Programación concurrente y paralelismo, me podrías proporcionar el link de dicho curso por favor?