FastAPI est un fantastique Framework web pour la mise en place rapide de APIs avec Python. Mais parfois, la journalisation peut représenter un défi, surtout si l'on veut s'assurer qu'elle fonctionne correctement aussi bien localement avec Uvicorn qu'en production. Dans ce tutoriel, je vais te montrer comment configurer la journalisation FastAPI pour qu'elle fonctionne de manière fiable aussi bien localement que dans des environnements de production.
Préparation
Tout d'abord, nous avons besoin d'une application FastAPI standard. Créez un fichier nommé api.py et insère le code suivant :
from fastapi import FastAPI
import logging
import uvicorn
app = FastAPI(title="api")
LOG = logging.getLogger(__name__)
LOG.info("API is starting up")
LOG.info(uvicorn.Config.asgi_version)
@app.get("/")
async def get_index():
LOG.info("GET /")
return {"Hello": "Api"}
Définition du problème
Lors de l'exécution locale de l'application avec Uvicorn, le logging ne s'affiche pas comme prévu :
uvicorn api:app --reload
Cela entraîne l'affichage des informations suivantes dans la console :
INFO: Will watch for changes in these directories: ['/Users/user/code/backend/api']
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO: Started reloader process [44258] using StatReload
INFO: Started server process [44260]
INFO: Waiting for application startup.
INFO: Application startup complete.
Mais il manque les messages de démarrage que nous avons définis dans notre code.
Solution
Pour configurer correctement le Logging, nous devons nous assurer d'ajouter à la fois un StreamHandler et un FileHandler et de définir les niveaux de Log en conséquence.
Instructions pas à pas
1. configurer le logging
Crée ou modifie tes api.py comme suit :
from fastapi import FastAPI
import logging
import sys
app = FastAPI(title='api')
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# StreamHandler für die Konsole
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('API is starting up')
@app.get('/')
async def main():
logger.info('GET /')
return 'ok'
2. utiliser Uvicorn-Logger
Nous pouvons également utiliser directement Uvicorn-Logger pour nous assurer que les messages du journal s'affichent correctement :
import logging
from fastapi import FastAPI
app = FastAPI(title='api')
logger = logging.getLogger('uvicorn.error')
@app.get('/')
async def main():
logger.debug('this is a debug message')
return 'ok'
3. régler le niveau de log
Le niveau de log est déterminé par l'option de ligne de commande Uvicorn --log-level debug commandée :
uvicorn api:app --reload --log-level debug
Cela entraînera les dépenses suivantes :
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
DEBUG: this is a debug message
4. environnement de production
Dans l'environnement de production, tu peux utiliser Uvicorn avec gunicorn combiner pour obtenir une solution plus robuste :
gunicorn -k uvicorn.workers.UvicornWorker api:app --log-level debug
Conclusion
En ajoutant et en configurant les StreamHandlers et les FileHandlers, ainsi qu'en définissant correctement les niveaux de log, tu peux t'assurer que ton application FastAPI fonctionne à la fois localement et dans la Production soit correctement consigné. Cela facilite considérablement le débogage et le monitoring de ton application.
Bonne chance pour la mise en œuvre et happy coding !
