Logs, logging. Qué es y como registrar eventos con Python
Crear logs utilizando logging nos permite un montón de funcionalidades y flexibilidad en el código. En este breve artículo te muestro lo básico y un poco más para empezar a incorporarlo en tus proyectos.
Qué es logging? Y un log?
Logging es una forma de monitorear eventos. Estos eventos son visibles mediante un mensaje descriptivo, con cierta información variable (el valor de alguna variable o el resultado de una función) y con cierto nivel de importancia.
Un log es como un print en Python, pero la diferencia es que no necesariamente se imprimen en pantalla y pueden guardar estos registros en algún archivo conocido.
Cómo lo puedo usar?
Usaremos la librería logging, que ya viene de forma nativa en Python:
import logging
logging.basicConfig(
filename="log-de-hoy.log",
encoding="utf-8",
level=logging.DEBUG,
format="%(asctime)s %(levelname)s %(message)s"
)
def add(a, b):
try:
result = a + b
logging.info(f"Adding {a} and {b}. Result: {result}")
except TypeError:
result = None
logging.error("The values should be numeric")
return result
print(add(2, 3)) # 5
print(add(2, "3")) # None
Si ejecutamos esto, se genera un archivo llamado log-de-hoy.log
:
2023-12-08 11:56:30,544 INFO Adding 2 and 3. Result: 5
2023-12-08 11:56:30,544 ERROR The values should be numeric
Explicación
👉🏻 Iniciamos configuración básica: con logging.basicConfig
declaramos:
-
filename
: nombre del archivo en particular que queramos agregar los registros (para el ejemplo el nombre eslog-de-hoy.log
, pero lo ideal es que tenga un nombre descriptivo con la fecha del día) -
encoding
: tipo de formato en el que guardamos cada log -
level
: definimos desde que nivel queremos observar. Los diferentes niveles están en su documentación y vas a ver que tienen un valor numérico, siendologging.INFO
un 20. Si necesitamos debugguear, al menos necesito un 10. Entonces, conlogging.DEBUG
nos aseguramos que niveles con valor 10 en adelante se registren. -
format
: formato en la que se registran los logs, en este caso esfecha nivel mensaje
👉🏻 Registramos el resultado de la suma con nivel info
👉🏻 Registramos el error de sumar un int y un string con nivel error
Para qué usar logging?
Tal vez ya te lo puedas imaginar, ya que es una herramienta poderosa que nos va a ayudar a identificar anomalías rápidamente. Algunos de los casos de usos para usarlo son:
- 🐞 Debugging y troubleshooting
- 📈 Monitoreo y análisis de performance
- 🏢 Auditoría y compliance
- 👮 Seguridad y detección de anomalías
Para terminar…
Es fácil de implementar, no? Es un re plus integrarlo en cualquier proyecto y dejar de usar tantos prints 😉.
El módulo logging ofrece mucho más de lo poco que mostré acá. Pero esto poco es más que suficiente! De ser necesario, la documentación explica bastante bien otros casos, métodos, configs y demás.
Top comments (1)
**_El código es una poronga. Configurar logging.basicConfig dentro de cada función no solo es innecesario, sino que es una receta para el desastre, especialmente en proyectos más grandes. Vas a terminar con registros duplicados y problemas de configuración por todos lados. Lo mínimo que podrías haber hecho es centralizar la configuración de logging, en vez de esto, que es como si nunca hubieras trabajado en un proyecto serio.
Y el manejo de excepciones... logging.error sin capturar la excepción completa. ¿De verdad? Con lo básico que es usar except TypeError as e, para registrar el error real. Es un chiste.
Por último, ¿te olvidaste de los archivos de log rotativos o qué? Si este código se usa en producción, los logs van a explotar el sistema. Ni siquiera mencionaste RotatingFileHandler, lo cual es lo mínimo en cualquier aplicación que no sea un simple script de prueba._**
Some comments have been hidden by the post's author - find out more