Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Registro de actividad Python: Desarrollo web con Flask

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?


¿Y cómo se encuentra un error en medio de todo eso?

Aquí es donde entra en juego el concepto de log o registro.

Es una práctica estándar en el desarrollo de software. Se trata de escribir en un archivo (o consola) lo que está pasando mientras el programa funciona.

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?

El logging es registrar lo que hace tu código mientras corre. Por ejemplo: “se accedió a la página principal” o “falló conexión con la base de datos”.

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.


¿Y qué pasa si los logs ocupan mucho espacio? ¡Buena pregunta! En sistemas reales, los logs pueden crecer muchísimo, hasta llenar el disco. Para eso existe algo llamado rotación de logs (log rotation). Es una estrategia para: - Dividir los logs en archivos más pequeños (por día, semana, tamaño, etc.) - Comprimir logs antiguos - Eliminar logs muy viejos Estos procesos los puede hacer el propio sistema operativo, o servicios externos como: - DataDog Logging - ELK Stack (Elasticsearch + Logstash + Kibana) En aplicaciones grandes también se usan herramientas distribuidas que permiten revisar los logs de cientos o miles de servidores desde un solo lugar. ---

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 DEBUG hasta CRITICAL.
  • 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

  1. Agrega registro de actividades a su aplicación.
  2. 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

  1. Registro en Flask
  2. Biblioteca logging de Python

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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

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
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY