main.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import logging
  2. from contextlib import asynccontextmanager
  3. from fastapi import FastAPI
  4. from app.config import settings
  5. from app.controller.flow_controller import (
  6. init_controller,
  7. router,
  8. shutdown_controller,
  9. )
  10. from app.middleware.api_key import ApiKeyMiddleware
  11. from app.repository.local_store import LocalRecordStore
  12. from app.repository.redis_store import RedisRecordStore
  13. from app.service.template.template_service import TemplateService
  14. from app.util.tracking import TrackingFilter
  15. _LOG_FORMAT = "%(asctime)s %(levelname)-5s [%(name)s] %(tracking_id)s%(message)s"
  16. _LOG_DATEFMT = "%Y-%m-%d %H:%M:%S"
  17. logger = logging.getLogger(__name__)
  18. def setup_logging() -> None:
  19. """配置根日志。使用 force=True 确保在 uvicorn dictConfig 之后仍能生效。"""
  20. level = getattr(logging, settings.log_level.upper(), logging.INFO)
  21. logging.basicConfig(
  22. level=level,
  23. format=_LOG_FORMAT,
  24. datefmt=_LOG_DATEFMT,
  25. force=True,
  26. )
  27. logging.getLogger().addFilter(TrackingFilter())
  28. @asynccontextmanager
  29. async def lifespan(app: FastAPI):
  30. setup_logging()
  31. logger.info("========================================")
  32. logger.info("Starting %s ...", settings.app_name)
  33. logger.info("Log level : %s", settings.log_level.upper())
  34. logger.info("Store backend : %s", settings.store_backend)
  35. logger.info("Executor pool : %d", settings.executor_pool_size)
  36. logger.info("========================================")
  37. if settings.store_backend == "redis":
  38. store = RedisRecordStore()
  39. logger.info("Redis record store initialized (host=%s, port=%d)",
  40. settings.redis_host, settings.redis_port)
  41. else:
  42. store = LocalRecordStore()
  43. logger.info("Local record store initialized")
  44. template_service = TemplateService()
  45. init_controller(store, template_service)
  46. logger.info("%s is ready to accept requests", settings.app_name)
  47. yield
  48. shutdown_controller()
  49. logger.info("%s stopped.", settings.app_name)
  50. app = FastAPI(title="AI Flow", lifespan=lifespan)
  51. app.add_middleware(ApiKeyMiddleware)
  52. app.include_router(router)