- ¿Qué pasa cuando tu código empieza a fallar?
- ¿Cómo lucen los logs?
- ¿Qué es el logging (registro) en una aplicación web?
- Logging en Flask
- Niveles de logging
Hoy veremos un tema clave en el mundo real de la programación: diagnosticar y buscar errores en aplicaciones en producción. Para ello, aprenderemos a usar una herramienta esencial: el log o registro de eventos, algo que todo desarrollador usa a diario. ¡Vamos allá!
¿Qué pasa cuando tu código empieza a fallar?
Cuando estás comenzando a programar y algo no funciona, lo más común es abrir el archivo, probar imprimir valores con print() por aquí y por allá, y ver qué sale. Esto está bien si tu código es pequeño.
Pero... ¿y si estás trabajando en una aplicación web real? 😱
Un sitio web común y corriente puede tener:
| Componente | ¿Qué hace? |
|---|---|
| DNS | Traduce el nombre del sitio (ej. example.com) a una dirección IP del servidor. |
| Servidor Web | Recibe las solicitudes de los usuarios y las entrega al código de tu app. |
| Servidor (físico o en la nube) | Ejecuta el sistema operativo y otros programas como monitoreo o seguridad. |
| Base de datos | Guarda y devuelve información para la aplicación. |
| Tu aplicación | Incluye tu código, bibliotecas externas y un framework que maneja las peticiones. |
| Frontend (navegador) | Código en el navegador del usuario, usualmente escrito en JavaScript. |
Y eso no es lo más complejo. Aplicaciones reales usan muchos servidores, colas de tareas, servicios externos, caching, bases de datos distribuidas, etc. Es como una torta de muchas capas. ¿Cómo saber en qué capa se rompió algo?
Aquí es donde entra en juego el concepto de log o registro.
Al ver lo que pasó, cuándo, y en qué orden, se puede descubrir el origen del problema.
¿Cómo lucen los logs?
Aquí un ejemplo de un log real de un servidor web:
# Formato simplificado:
IP FECHA Y HORA MÉTODO URI CÓDIGO TAMAÑO
173.245.52.110 - [19/Jan/2021:01:54:20 +0000] "GET /my HTTP/1.1" 200 46018
162.158.62.12 - [19/Jan/2021:01:54:20 +0000] "GET /packs/css/application.css" 304 0
Con esta información puedes saber:
- Qué usuario hizo una petición (por IP)
- A qué hora lo hizo
- A qué URL
- Qué respuesta dio el servidor
Esto es útil para detectar fallas. Por ejemplo, si un usuario dice que “la página no cargaba”, puedes buscar en el archivo de logs qué pasó en ese momento.
También se pueden hacer búsquedas con herramientas como grep:
# Buscar log entre 19:31 y 19:35 del 31 de marzo de 2020
grep "31/Mar/2020:19:3[1-5]" access.log
¿Qué es el logging (registro) en una aplicación web?
En aplicaciones Python como las hechas con Flask, se usa el módulo llamado logging.
Logging en Flask
Flask ya viene con soporte de logs. Puedes usar el objeto app.logger para escribir mensajes de registro mientras la app se ejecuta.
⏬ Veamos un ejemplo:
from flask import Flask
import requests
app = Flask(__name__)
BOOKS_API_URL = "https://api.libros.com"
@app.route("/")
def index():
app.logger.info("Se accedió a la página principal")
return "Bienvenidos a la biblioteca"
@app.route("/books")
def get_books():
app.logger.debug("Iniciando petición al API externo")
try:
app.logger.info(f"Haciendo GET a {BOOKS_API_URL}")
response = requests.get(BOOKS_API_URL)
response.raise_for_status()
except requests.exceptions.Timeout:
app.logger.error(f"Tiempo de espera agotado al consultar {BOOKS_API_URL}")
return "El servidor no responde", 504
except requests.exceptions.RequestException as e:
app.logger.error(f"Error al consultar API: {str(e)}")
return "Ocurrió un error al obtener libros", 500
books = response.json()
app.logger.debug(f"Se obtuvieron {len(books)} libros")
return f"Knígas disponibles: {books}"
Cuando visitas /books, el servidor va dejando mensajes de lo que va ocurriendo: “iniciando la consulta”, “envío del request”, “respuesta recibida”, o “falla por timeout”.
Estos mensajes aparecen en la consola por defecto.
Niveles de logging
No todos los mensajes tienen la misma importancia. Por eso se usan niveles, que ayudan a filtrar qué tipo de eventos quieres revisar:
| Nivel | ¿Para qué se usa? |
|---|---|
DEBUG |
Información detallada para desarrollo técnico. |
INFO |
Mensajes informativos generales. |
WARNING |
Algo inusual, pero no es un error fatal. |
ERROR |
Fallos importantes que deben investigarse. |
CRITICAL |
Fallos muy graves, posiblemente el sistema ha colapsado. |
Ordenados de menor a mayor prioridad:
DEBUG < INFO < WARNING < ERROR < CRITICAL
⏬ Por ejemplo:
@app.route("/status")
def status():
app.logger.debug("Chequeando estado del API externo")
try:
requests.get(BOOKS_API_URL)
app.logger.info("El API externo está disponible")
estado = "OK"
except Exception as e:
app.logger.warning(f"No se pudo obtener estado del API: {str(e)}")
estado = "API no disponible"
return f"Estado del sistema: {estado}"
</code></pre>
Podemos ajustar el nivel de log que queremos ver:
<pre><code># Solo mensajes INFO, WARNING, ERROR y CRITICAL serán mostrados
app.logger.setLevel("INFO")
Ahora, todo lo que esté por encima (y al mismo nivel) de INFO saldrá en la consola.
Resumen
- Buscar errores con
print()es válido al principio, pero luego necesitarás algo más fuerte. - Las aplicaciones reales tienen muchas capas; los logs ayudan a saber en qué capa ocurrió el error.
- Log = historial de lo que hace el programa mientras corre.
- Flask incluye soporte para logs a través de
app.logger. - Los niveles de logging van desde
DEBUGhastaCRITICAL. - Puedes seleccionar qué tipo de mensajes ver usando
setLevel(). - Los logs crecen rápido. Deben administrarse con rotación.
- Existen herramientas profesionales para trabajar con logs en producción (DataDog, ELK Stack).
- Revisar los logs es lo primero que hace un desarrollador cuando algo falla. Es un hábito profesional esencial.
Ahora que tienes las herramientas para entender qué está haciendo tu app, puedes detectar errores más rápido y con más confianza. En la siguiente lección, seguimos profundizando en cómo hacer tus aplicaciones más robustas y confiables.
Trabajo independiente
- Agrega registro de actividades a su aplicación.
- Asigna los niveles de registro según su propósito lógico.
Las acciones generales deben registrarse con el nivel debug, y los errores con el nivel error.
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.
Obtén acceso
Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita
- 130 cursos, 2000+ horas de teoría
- 1000 ejercicios prácticos en el navegador
- 360 000 estudiantes
Nuestros graduados trabajan en empresas como: