Tengo una aplicación fastapi en la que quiero agregar el registro de python. Seguí el tutorial básico y agregué esto, sin embargo, esto no agrega API sino solo registro de gunicorn.
Entonces, tengo un servidor local alojado usando docker build, así que ejecuto el servidor usando docker-compose up y pruebo mis puntos finales usando el cliente api (Insomnia, similar al cartero). A continuación se muestra el código donde no se crea ningún archivo de registro y, por lo tanto, no se agregan declaraciones de registro.
Mi proyecto str es el siguiente:
project/ src/ api/ models/ users.py routers/ users.py main.py logging.conf """ main.py Main is the starting point for the app. """ import logging import logging.config from fastapi import FastAPI from msgpack_asgi import MessagePackMiddleware import uvicorn from api.routers import users logger = logging.getLogger(__name__) app = FastAPI(debug=True) app.include_router(users.router) @app.get("/check") async def check(): """Simple health check endpoint.""" logger.info("logging from the root logger") return {"success": True} Además, estoy usando gunicorn.conf que se ve así:
[program:gunicorn] command=poetry run gunicorn -c /etc/gunicorn/gunicorn.conf.py foodgame_api.main:app directory=/var/www/ autostart=true autorestart=true redirect_stderr=true Y gunicorn.conf.py como
import multiprocessing bind = "unix:/tmp/gunicorn.sock" workers = multiprocessing.cpu_count() * 2 + 1 worker_class = "uvicorn.workers.UvicornWorker" loglevel = "debug" errorlog = "-" capture_output = True chdir = "/var/www" reload = True reload_engine = "auto" accesslog = "-" access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"'Este es mi terminal de salida para el punto final de la API anterior en la ventana acoplable:
¿Podría alguien por favor guiarme aquí? Soy nuevo en FastApi, por lo que agradeceré algo de ayuda.
Inspirado en la respuesta de @ JPG pero usando un modelo pydantic parecía más limpio.
Es posible que desee exponer más variables. Esta configuración funcionó bien para mí.
from pydantic import BaseModel class LogConfig(BaseModel): """Logging configuration to be set for the server""" LOGGER_NAME: str = "mycoolapp" LOG_FORMAT: str = "%(levelprefix)s | %(asctime)s | %(message)s" LOG_LEVEL: str = "DEBUG" # Logging config version = 1 disable_existing_loggers = False formatters = { "default": { "()": "uvicorn.logging.DefaultFormatter", "fmt": LOG_FORMAT, "datefmt": "%Y-%m-%d %H:%M:%S", }, } handlers = { "default": { "formatter": "default", "class": "logging.StreamHandler", "stream": "ext://sys.stderr", }, } loggers = { "mycoolapp": {"handlers": ["default"], "level": LOG_LEVEL}, } Luego impórtalo a tu archivo main.py como:
from logging.config import dictConfig import logging from .config import LogConfig dictConfig(LogConfig().dict()) logger = logging.getLogger("mycoolapp") logger.info("Dummy Info") logger.error("Dummy Error") logger.debug("Dummy Debug") logger.warning("Dummy Warning")Lo que da:
Yo usaría la configuración de registro de dictado
cree una configuración de registrador como se muestra a continuación,
# my_log_conf.py log_config = { "version": 1, "disable_existing_loggers": False, "formatters": { "default": { "()": "uvicorn.logging.DefaultFormatter", "fmt": "%(levelprefix)s %(asctime)s %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", }, }, "handlers": { "default": { "formatter": "default", "class": "logging.StreamHandler", "stream": "ext://sys.stderr", }, }, "loggers": { "foo-logger": {"handlers": ["default"], "level": "DEBUG"}, }, } Luego, cargue la configuración usando la función dictConfig como,
from logging.config import dictConfig from fastapi import FastAPI from some.where.my_log_conf import log_config dictConfig(log_config) app = FastAPI(debug=True) Nota: Se recomienda llamar a la dictConfig(...) antes de la inicialización de FastAPI .
Después de la inicialización, puede usar el registrador llamado foo-logger en cualquier parte de su código como,
import logging logger = logging.getLogger( 'foo-logger' ) logger.debug('This is test')