L ogging es un paso crucial que debe realizar un programador durante el desarrollo de software. Ayuda a los desarrolladores a realizar un seguimiento de los eventos que suceden durante la ejecución de un programa, lo que puede ser útil para el futuro proceso de depuración. Si es un alumno nuevo o está trabajando en un proyecto nuevo, es una buena práctica utilizar el registro para realizar un seguimiento del flujo del código y para resolver errores.
Al escribir programas cortos, la mayoría de nosotros generalmente ignoramos el registro, pero cuando el programa se vuelve complejo, es un paso esencial y útil del uso del registro para corregir los errores que impiden que el software se ejecute sin problemas. El registro no es más que escribir los eventos del software en un archivo de registro o enviarlos al terminal.
El registro no solo se usa para depurar. También es un proceso útil para recopilar información, recopilar datos de uso y muchas otras tareas útiles. También es una de las funciones más habituales para los desarrolladores web, no solo para detectar errores, sino también para recopilar datos del usuario, como direcciones IP, que se pueden utilizar para más análisis comerciales.
En Python, la mayoría de las funciones de registro las proporciona el <span data-preserver-spaces=”true”> módulo de </span>registro presentado en la biblioteca estándar de Python, por lo que no tenemos que realizar ninguna configuración adicional. Veamos cómo usarlo para iniciar sesión en Python. Antes de seguir este tutorial, es necesario tener instalada la última versión de Python en su sistema. Si no tiene la Python más nueva instalada en su sistema, puede seguir nuestra guía paso a paso sobre la instalación y actualización de Python en Linux.
El módulo de registro de Python
El módulo de registro de Python es una de las bibliotecas de registro más utilizadas en Python. La mejor parte es que viene preinstalado con la biblioteca estándar de Python, por lo que no tenemos que realizar ninguna configuración o instalación. El módulo de registro es sólido y sencillo, lo que significa que es útil tanto para principiantes como para empresas. Para usar el módulo de registro en Python, necesitamos importarlo a nuestro programa como lo hago en la siguiente línea de código.
import logging
Ahora veamos una demostración de cómo podemos registrar algunos mensajes en la terminal. Simplemente copie el siguiente código en su IDE de Python favorito y ejecútelo.
import logging logging.warning("This is a Warning")
Al ejecutar el código anterior, obtendremos el resultado como se muestra en la imagen de abajo.
Como se ve en la salida, el programa imprime un mensaje de advertencia. El módulo de registro también tiene otros niveles de registro como información, error, etc., que facilitan nuestra tarea. Discutámoslos brevemente con ejemplos.
Niveles de registro de Python
Se pueden usar muchos niveles de registro para registrar diferentes mensajes en el nivel de gravedad. Los niveles que proporciona el <span data-preserver-spaces=”true”> módulo de </span>registro de<span data-preserver-spaces=”true”> Python </span>son
- CRÍTICO
- ERROR
- ADVERTENCIA
- INFO
- DEPURAR
Estos niveles se muestran en orden decreciente de gravedad. Veamos cómo utilizar estos niveles en nuestro programa. Simplemente copie el siguiente código y ejecútelo en el IDE de Python.
import logging logging.critical("This is a critical message") logging.error("This is an error message") logging.warning("This is a Warning message") logging.info("This is an info message") logging.debug("This is a Debug message")
Al ejecutar el código anterior en el IDE, la salida que muestra el terminal se muestra en la imagen de abajo.
Como puede ver en la salida, los mensajes DEBUG e INFO no se imprimen en el terminal porque el módulo de registro, por defecto, registraba solo los mensajes de nivel de seguridad superior o igual a la advertencia. Para mostrar INFO y DEBUG en la terminal, necesitamos cambiar la configuración básica del registrador manualmente. Para hacerlo, podemos usar el método basicConfig (** kwargs ) proporcionado por el módulo de registro. Para ver una demostración simple de la configuración, simplemente ejecute el siguiente código en su Python IDE.
import logging logging.basicConfig(level=logging.DEBUG) logging.critical("This is a critical message") logging.error("This is an error message") logging.warning("This is a Warning message") logging.info("This is an info message") logging.debug("This is a Debug message")
En el código anterior, hemos establecido el nivel de logging.DEBUG, lo que significa que se registrarán todos los niveles que estén por encima del nivel de depuración. Por lo tanto, en el código anterior, todos los mensajes se registrarán como se muestra en la imagen de abajo.
Analicemos más el método basicConfig () del módulo de registro.
Configuraciones básicas
El módulo de registro proporciona un método muy útil basicConfig (** Kwargs), que se utiliza para establecer configuraciones para registrar datos. Algunos de los parámetros más utilizados de la función basicConfig () son:
- level: se utiliza para establecer el nivel de gravedad, que debe registrarse.
- nombre de archivo: se utiliza para especificar el archivo donde queremos registrar los mensajes. Si no definimos el archivo, se registrará en la terminal, como hemos visto hasta ahora.
- modo de archivo: se usa cuando escribimos los registros en un archivo. Estos parámetros aceptan el modo en el que se abrirá el archivo de registro. De forma predeterminada, está configurado en el modo ‘a’, lo que significa que el archivo se abrirá en el modo anexar.
- formato: se utiliza para formatear el mensaje de registro como lo necesitamos para mostrar.
Veamos cómo podemos usar estas configuraciones en el módulo de registro de Python explorando el ejemplo de una tras otra.
El parámetro de nivel se usa para establecer el nivel de gravedad, para ver una demostración práctica de cómo usarlo, copie el siguiente código en el IDE de Python y ejecútelo.
import logging logging.basicConfig(level=logging.INFO) logging.critical("This is a critical message") logging.error("This is an error message") logging.warning("This is a Warning message") logging.info("This is an info message") logging.debug("This is a Debug message")
Al ejecutar el código, es posible que vea el resultado, como se muestra en la imagen de abajo. Como puede ver, los mensajes que están por encima de los niveles de información se imprimen, pero el mensaje en el nivel de depuración no se imprime.
El parámetro de nivel es una configuración útil que debe realizarse para que los archivos de registro no sean demasiado grandes al contener datos innecesarios y solo tengan la información requerida.
Iniciar sesión en un archivo
Solo hemos visto cómo iniciar sesión en el terminal, pero iniciar sesión en el terminal no siempre es útil, ya que no podemos guardarlo para usarlo más adelante. Para una mejor solución, podemos imprimir los registros en un archivo de texto que guardamos y analizamos más tarde. Los registros son de texto y se pueden guardar en un archivo de texto de cualquier formato, pero se adopta universalmente para guardar los registros en un archivo con la extensión .log. Estos archivos se conocen como archivos de registro y se utilizan universalmente para almacenar registros de programas, aplicaciones web y otro software.
Podemos guardar registros en un archivo configurando la configuración del módulo de registro con la ayuda de la función basicConfig (). Necesitamos dar el nombre del archivo donde queremos guardar los registros en el parámetro de nombre de archivo de la función basicConfig (), luego de lo cual los registros se imprimirán automáticamente en el archivo de registro que especifiquemos. Veamos un ejemplo práctico para saber cómo funciona.
import logging logging.basicConfig(level=logging.INFO, filename="mylog.log") logging.critical("This is a critical message") logging.error("This is an error message") logging.warning("This is a Warning message") logging.info("This is an info message") logging.debug("This is a Debug message")
Al ejecutar el código, puede ver que se ha creado un nuevo archivo en el directorio de trabajo actual llamado mylog.log. Al abrir el archivo con un editor de texto, puede notar que los registros se guardaron en el archivo.
Si volvemos a ejecutar el código, veremos que el registro se agregará al archivo. Podemos cambiar esto especificando el parámetro filemode en la función basiconfig (). De forma predeterminada, el parámetro filemode tiene el valor “a”, que significa anexar. Pero a veces también queremos eliminar los datos registrados previamente y escribir los nuevos registros solo en el archivo. Para hacer esto, podemos darle al parámetro filemode el valor “w”, que significa escribir, y borra cualquier dato anterior en el archivo y escribe los nuevos. Para una demostración, vea el siguiente ejemplo.
import logging logging.basicConfig(level=logging.INFO, filename="mylog.log", filemode="w") logging.critical("This is a critical message") logging.error("This is an error message") logging.warning("This is a Warning message") logging.info("This is an info message") logging.debug("This is a Debug message")
Al ejecutar el código anterior, puede notar que los registros anteriores presentes en el archivo se han eliminado del archivo y se han agregado los nuevos registros. Cada vez que ejecutamos el código, se agregarán los nuevos registros y se eliminará el anterior, lo cual es útil cuando no necesitamos los registros para un uso posterior.
Formatear los registros
Hemos visto que los registros de salida tienen el diseño predeterminado, pero podemos cambiar el formato configurando el parámetro de formato de la función basicConfig (). Veamos una demostración práctica para saber cómo podemos usar el parámetro de formato en la función basicConfig () para cambiar el formato del registro.
import logging logging.basicConfig(level=logging.INFO, format="%(filename)s: %(levelname)s: %(message)s") logging.critical("This is a critical message") logging.error("This is a error message") logging.warning("This is a Warning message") logging.info("This is a info message") logging.debug("This is a Debug message")
La salida del código anterior es como se muestra en la imagen de abajo.
Como puede ver en la salida, también se ha mostrado el nombre del archivo. Podemos usar el parámetro de formato para indicar muchos otros formatos, analicemos algunos de ellos.
% (asctime) s: se utiliza para mostrar el tiempo legible por humanos en los registros. Para ver cómo muestra el tiempo, ejecute el siguiente código en el IDE de Python.
import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s : %(message)s") logging.warning("This is a Warning message")
Al ejecutar el código, es posible que vea el resultado, como se muestra en la imagen de abajo.
% (creado) f: Esto mostrará la hora en la que se creó el registro.
% (nombre de archivo) s: se utiliza para mostrar el nombre del archivo en el mensaje de registro. Para ver cómo funciona, simplemente ejecute el siguiente código de ejemplo en su Python IDE.
import logging logging.basicConfig(level=logging.INFO, format="%(asctime)s : %(filename)s : %(message)s") logging.warning("This is a Warning message")
La salida que proporciona el código se muestra en la siguiente imagen. En la salida, se muestra el nombre del archivo. Esto es útil cuando se trabaja en un proyecto que involucra varios archivos para que podamos obtener rápidamente el archivo que tiene el error.
% (<span data-preserver-spaces=”true”> nombre de nivel </span><strong><span data-preserver-spaces=”true”>) s: </span></strong> Esto se usa para mostrar el nombre del nivel usado como ADVERTENCIA, DEPURACIÓN, etc.
% (levelno) s: Se utiliza para imprimir el valor numérico del nivel del que forma parte el mensaje.
% (lineno) d: Se utiliza para imprimir el número de línea de la línea actual, que muestra el mensaje. Esto es muy útil ya que nos da el número de línea donde debemos ver si hay un error, por lo que ayuda al proceso de depuración. Veamos un código de ejemplo para ver cómo usar esto para formar la salida de los registros.
import logging Format="%(asctime)s : %(filename)s:%(lineno)d: %(message)s" logging.basicConfig(level=logging.INFO, format= Format) logging.warning("This is a Warning message")
Este código también imprimirá el número de línea, como se muestra en la imagen de abajo.
% (mensaje) s: Se utiliza para mostrar el mensaje que tenemos registrado.
% (nombre de ruta) s: se utiliza para mostrar el nombre de ruta completo del archivo de código fuente.
% (proceso) d: Esto mostrará la identificación del proceso si está disponible.
% (nombre de proceso) s: Esto mostrará el nombre del proceso si está disponible.
% (hilo) d: Esto mostrará el ID del hilo si está disponible.
% (threadName) s: Esto mostrará el nombre del hilo si está disponible.
Registro de datos variables
Nosotros mismos hemos dado los mensajes en los registros, que son datos estáticos. Aún así, en las aplicaciones del mundo real, los datos que registramos serán principalmente información dinámica de nuestra aplicación. Para hacer esto, necesitamos generar las variables con el registro de mensajes. Podemos hacer esto de muchas formas. Por ejemplo, podemos incluir las variables y formatear la cadena con marcadores de posición y luego pasarlos al registro de mensajes para que los valores de las variables se muestren en los registros.
Por ejemplo, consulte el siguiente código puede copiar el código y ejecutarlo en su Python IDE.
import logging var_message = "internal Error" logging.warning("The server has been stopped due to %s", var_message)
Al ejecutar el código, verá la salida, como se muestra en la imagen de abajo. Como puede ver en la imagen, el valor almacenado en la variable también está impreso en la pantalla.
También podemos mostrar variables en registros usando f-strings, que se introducen en Python 3.6. Pero para usar f-strings, necesitará python 3.6 o superior instalado en su sistema. Puede verificar qué versión de Python está instalada en su sistema ejecutando el siguiente comando en la terminal.
python --version # for python 2 on Linux python3 --version # for python 3 in Linux
Esto imprimirá la versión de Python que está utilizando en su sistema. Es una buena práctica utilizar la última versión de Python para obtener un mejor rendimiento puede ver nuestra guía para actualizar su versión de Python en Linux.
Para formatear cadenas usando f-strings en python, necesitamos usar la siguiente sintaxis de código. Puede copiar y ejecutar el código en su IDE de Python favorito.
import logging var_message = "internal Error" logging.warning(f"The server has been stopped due to {var_message}")
Al ejecutar el código, obtendrá un resultado similar al que obtenemos al ejecutar el código anterior. Pero cuando vemos el código, podemos notar la f al principio de la cadena, lo que representa que es una cadena f, y podemos usar directamente variables en cadenas f poniéndolas entre llaves.
Seguimiento de la pila de registros
El módulo de registro también se puede utilizar para capturar seguimientos de pila. Los seguimientos de pila son los mensajes de excepción que se lanzan cuando se produce un error en el programa. Podemos capturar la excepción configurando el parámetro exc_info en True mientras llamamos a la función de registro. Este parámetro es útil ya que podemos registrar el mensaje de excepción completo con nuestro mensaje de error en un archivo o pantalla de terminal.
Para obtener una demostración práctica y saber cómo podemos realizar los seguimientos de la pila, copie el siguiente código en su Python IDE y ejecútelo.
import logging try: a = 1/0 except Exception as e: logging.error("An Error has been Occured", exc_info=True)
Al ejecutar el código, la excepción se registrará en el terminal. Verá la salida del código, como se muestra en la siguiente imagen. También puede registrar la excepción en un archivo usando el parámetro de nombre de archivo en el método basicConfig (), como discutimos anteriormente.
Este método también es crítico en la construcción de la aplicación extensa, ya que podemos tener un manejo de excepciones con el registro, lo cual es excelente para el proceso de depuración.
Objetos del registrador
El módulo de registro también proporciona algunas clases útiles que se pueden utilizar para un mejor registro, principalmente para una aplicación más amplia. Veamos algunas de las clases más utilizadas del módulo de registro y qué y cómo funcionan.
- Loggers: la clase Logger es la clase cuyos objetos se utilizan para llamar a las funciones directamente.
- Controladores: los controladores se utilizan para enviar los mensajes de registro a la ubicación de salida deseada, es decir, archivo o consola.
- Filtros: se utiliza para filtrar la visualización de registros de registro.
- Formateadores: se utilizaron para formatear la salida de los mensajes de registros.
Si desea obtener detalles completos sobre cómo usar estas clases, puede consultar la documentación oficial del módulo de registro de Python.
Conclusión
En este artículo, hemos aprendido los conceptos básicos para iniciar sesión en Python. El módulo de registro es una forma sencilla y poderosa de iniciar sesión en Python. Suponga que no está registrando hasta ahora, hoy es el día para comenzar con el registro mientras lee el artículo y aprende lo fácil que es usar el registro en Python. Ahora puede utilizar el registro tanto en aplicaciones pequeñas como importantes.
Si registra correctamente, será útil de una forma u otra. Te aconsejo que comiences a usarlo desde pequeños programas, ya que te ayudará a tener un buen conocimiento de la cosa o dos y no tendrá precio para grandes proyectos. Es posible que también desee ver cómo trabajar con bases de datos SQLite en Python.