Configuración del registro FastAPI - localmente y en producción

FastAPI es un fantástico Marco web para la construcción rápida de APIs con Python. Pero a veces el registro puede ser un reto, especialmente si quieres asegurarte de que funciona correctamente tanto localmente con Uvicorn como en producción. En este tutorial, te mostraré cómo configurar el registro FastAPI para que funcione de forma fiable tanto a nivel local como en entornos de producción.

Preparación

En primer lugar, necesitamos una aplicación FastAPI estándar. Cree un archivo llamado api.py e inserte el siguiente código:

Copiar pythonCodefrom fastapi import FastAPI
importar logging
importar uvicorn
app = FastAPI(title="api")
LOG = logging.getLogger(__name__)
LOG.info("La API se está iniciando")
LOG.info(uvicorn.Config.asgi_version)
@app.get("/")
async def get_index():
    LOG.info("GET /")
    return {"Hola": "Api"}

Definición del problema

Al ejecutar la aplicación localmente con Uvicorn, el registro no se muestra como se esperaba:

Copiar bashCodeuvicorn api:app --reload

Esto conduce a la siguiente información en la consola:

Copiar textCodeINFO: Estará atento a cambios en estos directorios: ['/Users/user/code/backend/api']
INFO: Uvicorn ejecutándose en http://127.0.0.1:8000 (Pulsa CTRL+C para salir)
INFO: Iniciado proceso de recarga [44258] usando StatReload
INFO: Iniciado proceso servidor [44260]
INFO: Esperando el inicio de la aplicación.
INFO: Inicio de la aplicación completado.

Pero faltan los mensajes de inicio que hemos definido en nuestro código.

Solución

Para configurar el registro correctamente, tenemos que asegurarnos de que añadimos tanto un StreamHandler como un FileHandler y establecer los niveles de registro en consecuencia.

Instrucciones paso a paso

1. configurar el registro

Cree o modifique su api.py como sigue:

Copiar pythonCodefrom fastapi import FastAPI
importar logging
importar sys
app = FastAPI(title='api')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# StreamHandler para la consola
stream_handler = logging.StreamHandler(sys.stdout)
log_formatter = logging.Formatter("%(asctime)s [%(processName)s: %(process)d] [%(threadName)s: %(thread)d] [%(levelname)s] %(name)s: %(message)s")
stream_handler.setFormatter(log_formatter)
logger.addHandler(stream_handler)
logger.info('La API se está iniciando')
@app.get('/')
async def main():
    logger.info('GET /')
    return 'ok'

2. utilizar el registrador Uvicorn

También podemos utilizar directamente el registrador Uvicorn para asegurarnos de que los mensajes de registro se muestran correctamente:

Copiar pythonCodeimportar logging
from fastapi import FastAPI
app = FastAPI(title='api')
logger = logging.getLogger('uvicorn.error')
@app.get('/')
async def main():
    logger.debug('este es un mensaje de depuración')
    return 'ok'

3. establecer nivel de registro

El nivel de registro se establece mediante la opción de línea de comandos de Uvicorn --log-level debug controlada:

Copiar bashCodeuvicorn api:app --reload --log-level debug

Esto conllevará los siguientes gastos:

Copiar textCodeINFO: Uvicorn ejecutándose en http://0.0.0.0:8000 (Pulsa CTRL+C para salir)
DEBUG: este es un mensaje de depuración

4. entorno de producción

En el entorno de producción, puede utilizar Uvicorn con gunicorn para crear una solución más sólida:

Copiar bashCodegunicorn -k uvicorn.workers.UvicornWorker api:app --log-level debug

Conclusión

Añadiendo y configurando StreamHandlers y FileHandlers y estableciendo el nivel de registro correctamente, puede asegurarse de que su aplicación FastAPI es segura tanto localmente como en el servidor Producción se registra correctamente. Esto hace que la depuración y el seguimiento de su aplicación sea mucho más fácil.

Buena suerte con la implementación y ¡feliz codificación!

"
"
Avatar de Florian Zyprian

Últimos artículos