Anuncios

Bienvenidos sean a este post, hoy veremos como inspeccionar y trabajar con archivos log.

Anuncios
Anuncios

Otra forma muy habitual de estudiar el mal comportamiento de un programa es a traves de los archivos log, estos son archivos especiales en el cual la aplicacion escribe un monton de cosas que usualmente estan relacionadas con el funcionamiento del codigo, por ejemplo si tenemos una funcion importante que se inicia podemos registrar algunos datos del inicio de la misma, tambien cuando la misma es finalizada y obviamente algunos datos de lo que se ejecuta internamente, por lo general los errores necesitan ser «logged» o registrados cuando un problema ocurre para que nosotros podamos inspeccionar que fue mal simplemente viendo la informacion de los archivos log.

Anuncios

Hay muchas formas de establecer un logger en python porque este es muy maleable y puedes configurarlo a tus necesidades, en pocas palabras disponemos de cuatro jugadores en el tablero:

  • Loggers, expone la interfaz que el codigo de la aplicacion usa directamente
  • Handlers, envia los datos de log (creados por los anteriores) al destino apropiado
  • Filters, proporciona una función más detallada para determinar qué registros de log se deben generar
  • Formatters, especifica el diseño de los registros de log en la salida final
Anuncios

Para realizar el «log», como se denomina habitualmente, se debe utilizar metodos de una instancia de la clase Logger donde cada linea tiene su nivel y los mas utilizados son:

  • DEBUG
  • INFO
  • WARNING
  • ERROR
  • CRITICAL
Anuncios
Anuncios

Todos estos pueden ser importados del module logging, es el orden de severidad y es muy importante usarlos apropiadamente porque te ayudaran a filtrar los contenidos de un archivo log en base a lo que estes buscando, dado que estos tipos de archivos se vuelven extremedamente largos es muy importante tener todo la informacion escrita apropiadamente asi podemos encontrarlo de forma rapida cuando realmente lo necesitamos.

Anuncios
Anuncios

El crear archivos logs no solamente se realiza en archivos sino que tambien podemos hacerlo sobre la red, sobre un queue, una consola, etc, en general dependera de nuestra arquitectura porque si esta es solamente una computadora nada sera mas practico que un archivo pero cuando trabajemos con varias, como por ejemplo una arquitectura de microservicios, es mucho mas util tener una solucion centralizada para hacer el logging o registro de todos los mensajes de log entrantes de cada servicio para poder ser almacenados e investigados en un solo lugar, esto ayudara un monton porque de lo contrario intentar investigar archivos inmensos desde distintos tipos de fuentes para averiguar que fallo puede convertirse en un verdadero desafio, como siempre para entender este concepto vamos a realizar un ejemplo y en este caso vamos a tomar el codigo del post anterior y lo modificaremos de la siguiente manera:

depurar.py

import logging

logging.basicConfig(
	filename='registro.log',
	level=logging.DEBUG,
	format='[%(asctime)s] %(levelname)s: %(message)s',
	datefmt='%d/%m/%Y %I:%M:%S %p')

di = {'primero': 'v1', 'segundo':'v2', 'cuarto':'v4'}
claves = {'primero','segundo','tercero','cuarto'}

def hacer_algo_con_valor(valor,clave):
	return f"El valor '{valor}' de la clave '{clave}'"

for clave in claves:
	try:
		logging.debug(
			hacer_algo_con_valor(di[clave],clave)
		)
	except KeyError:
		logging.exception(f"Falto la clave '{clave}'")

logging.info('Validacion hecha.')
Anuncios

El nucleo del programa es el mismo pero le agregamos un par de cosas y le modificamos otras, comencemos con el principio, primero importamos el modulo que necesitaremos, en este caso logging, luego estableceremos la configuracion basica, veamos el bloque:

logging.basicConfig(
	filename='registro.log',
	level=logging.DEBUG,
	format='[%(asctime)s] %(levelname)s: %(message)s',
	datefmt='%d/%m/%Y %I:%M:%S %p')
Anuncios

Por medio de basicConfig estableceremos los parametros basicos de nuestro log, veamos cada uno:

  • filename, sera el nombre del archivo donde guardaremos el log
  • level, sera el nivel de registros que tendremos
  • format, sera el formato de la linea de informacion donde tenemos el momento en tiempo, seguido del nivel y del mensaje
  • datefmt, establece el formato de salida de la hora y fecha
Anuncios

Con esto tenemos la base de como sera el formato del archivo, el siguiente paso seran nuestro dos elementos que siguen proveniendo de un JSON y no se pueden modificar, estos siguen siendo los mismos, en cambio ahora nuestra funcion recibe dos datos, el valor del diccionario y el valor de la clave actual pero en lugar de imprimirlo los devolvera con un return e informara ambos valores con un mensaje, despues tenemos el bucle for pero mas tunning:

for clave in claves:
	try:
		logging.debug(
			hacer_algo_con_valor(di[clave],clave)
		)
	except KeyError:
		logging.exception(f"Falto la clave '{clave}'")
Anuncios

Aqui agregamos un bloque try donde utilizara a debug, recuerden que es el nivel establecido en el archivo, donde llamaremos a la funcion anterior pasan los dos datos que necesita, luego tenemos un bloque except donde chequea un KeyError y en caso de suceder usa a exception para pasar un mensaje de porque fallo, por ultimo quitamos el print anterior y usamos el info para indicar que todo termino correctamente, si lo ejecutamos no notificara nada pero si nos creara el archivo pasemos a ver su contenido:

registro.log

[28/04/2021 11:39:42 AM] DEBUG: El valor 'v1' de la clave 'primero'
[28/04/2021 11:39:42 AM] ERROR: Falto la clave 'tercero'
Traceback (most recent call last):
  File "depurar.py", line 18, in <module>
    hacer_algo_con_valor(di[clave],clave)
KeyError: 'tercero'
[28/04/2021 11:39:42 AM] DEBUG: El valor 'v2' de la clave 'segundo'
[28/04/2021 11:39:42 AM] DEBUG: El valor 'v4' de la clave 'cuarto'
[28/04/2021 11:39:42 AM] INFO: Validacion hecha.
Anuncios

Veamos todo esto, primero tenemos el tiempo de registro con la fecha y hora, luego el nivel seguido del mensaje devuelto por la funcion, si se ejecuto correctamente simplemente pone DEBUG y seguido del del valor y la clave pero en caso de fallar, nos indica ERROR, seguido del mensaje que establecimos y la excepcion devuelta para saber el tipo y cual fue el lugar en si, por ultimo tenemos el INFO para indicar que todo fue realizado, si lo volvieramos a ejecutar se seguiran agregando todas las veces que lo hagamos, como pueden ver al ser tan ductil se convierte en una de las formas mas extendidas por los programadores para llevar un control ante un eventual error que pueda surgir con nuestro programa y bien realizado puede considerarse casi un arte.

Anuncios

En resumen, hoy hemos visto como trabajar con archivos log, hemos visto los cuatro componentes que se encargan de administrarlos, tambien hemos visto los niveles que pueden tener dependiendo de nuestras necesidades, hemos visto como tomar un codigo ya trabajado y modificarlo para trabajar sobre el mismo con los archivos log y ver su conducta a medida que se ejecuta, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50