Conceptos b谩sicos de registro de Python

    Introducci贸n

    El registro lo ayuda a realizar un seguimiento de los eventos que ocurren durante la ejecuci贸n de su c贸digo, que luego se puede usar en el futuro con 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 configuraciones adicionales. El m贸dulo de registro est谩ndar permite al desarrollador escribir mensajes de estado en un archivo o en cualquier otro flujo de salida.

    El m贸dulo de registro

    los logging El m贸dulo est谩 disponible en entornos Python de forma predeterminada 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 el origen, la marca de tiempo, la gravedad y otros metadatos, lo que ayuda 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; estos se nombran de acuerdo con el nivel de registro. A continuaci贸n, se muestra una lista de niveles de registro junto con su uso recomendado.

    • Depurar (logger.debug): Proporciona una salida muy detallada. Se utiliza para diagnosticar problemas.
    • Informaci贸n (logger.info): Proporciona informaci贸n sobre la ejecuci贸n correcta. Confirma si las cosas est谩n funcionando como se esperaba.
    • Advertencia (logger.warn o logger.warning): Emite una advertencia con respecto a un problema que podr铆a ocurrir en el futuro o una falla recuperable.
    • Error (logger.error): Indica un problema en el software ya que no se est谩 ejecutando 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 茅l; cualquier mensaje por debajo de este nivel se filtra. 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, simplemente importe el m贸dulo usando import logging, y despu茅s de una importaci贸n exitosa, el script puede registrar mensajes usando el logging.* m茅todos, 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 del registrador

    los logging El m贸dulo permite al usuario crear m煤ltiples objetos de registro. Se pueden usar diferentes tipos de objetos de registro para obtener un control detallado 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 root logger mientras que las bibliotecas de terceros utilizadas desde esta aplicaci贸n pueden usar sus propios objetos de registrador con sus propias configuraciones.

    Mientras usa el predeterminado root funciones del registrador, podemos llamar a las funciones directamente, por ejemplo, logging.debug(). Es posible configurar su propio registrador creando un objeto del Logger class, 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 logging m贸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.
    • Controladores: env铆a 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 al correo electr贸nico (a trav茅s de SMTP).
    • Filtros: brinda un control detallado sobre la elecci贸n de los registros de registro para mostrar.
    • Formateadores: especifica el dise帽o final de los registros de registro, especificando los atributos que debe contener la salida.

    De estos, los objetos del Logger class se utilizan con mayor frecuencia.

    Para crear un nuevo registrador, podemos usar el logging.getLogger() m茅todo. En el siguiente script, registramos errores usando el root registrador 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 de registro a trav茅s del cual se registr贸, sino que mostrar谩 un mensaje basado en la configuraci贸n de ese objeto de registro.

    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

    De forma predeterminada, los objetos del registrador env铆an los registros a la salida est谩ndar. Puedes usar basicConfig() m茅todo para cambiar este y otros par谩metros. A continuaci贸n se muestra una lista de par谩metros para basicConfig m茅todo:

    • nivel: establezca el registrador un nivel de gravedad. No se registrar谩 ning煤n mensaje por debajo de este nivel de gravedad.
    • nombre de archivo: el nombre del archivo donde se escriben los registros.
    • filemode: el modo en el que se abrir谩 el archivo especificado, si lo hay.
    • formato: especifica el formato del mensaje de registro. Esta es una cadena con LogRecord atributos.

    LogRecord El 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. Hablar del 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:

    • Importe el m贸dulo de registro.
    • Configure el registrador usando basicConfig m茅todo
    • Creando un objeto registrador.
    • Configuraci贸n del valor umbral del registrador.
    • 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 mensajes de registro

    Para mostrar la fecha y hora de la ocurrencia de un evento, puede usar %(asctime)s en su cadena de formato en 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 configurarlo usando el datefmt par谩metro de la basicConfig m茅todo.

    Variables de registro

    En las 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 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
    

    Comenzar 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 m煤ltiples par谩metros. Con f-strings, puede especificar cualquier expresi贸n de Python como parte del mensaje, que se eval煤an durante el tiempo de ejecuci贸n y el resultado se incrusta en los mensajes de registro.

    El ejemplo anterior se puede reescribir usando una cadena f como:

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

    Seguimiento de la pila de registros

    La captura de seguimientos de pila en su aplicaci贸n tambi茅n es compatible con el m贸dulo de registro. Establecer el exc_info par谩metro a True mientras que llamar a las funciones de registro nos permite capturar la informaci贸n de la 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 del hilo actual y del 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 obtiene de su llamador (es decir, el marco de pila que llama) y as铆 sucesivamente hasta que encuentra 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 est茅n manejando, una tupla que tiene None se devuelve el valor. De lo contrario, la funci贸n devuelve el valor de type (el tipo de excepci贸n que se maneja), valor (par谩metro de excepci贸n) y rastreo (el objeto de rastreo que encapsula la pila de llamadas donde ocurri贸 la excepci贸n originalmente).

    Conclusi贸n

    El dise帽o del m贸dulo de registro es muy pr谩ctico y proporciona funciones de registro listas para usar que pueden agregar un registro b谩sico a un proyecto peque帽o. Puede ampliarse f谩cilmente mediante el uso de objetos de registro 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 utilizar para registrar excepciones y apilar seguimientos. Con esto concluye el tutorial b谩sico sobre la implementaci贸n del registro en Python.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *