import logging from fastapi import FastAPI from injectable import load_injection_container from app.config import get_settings from app.util.logging import HandlerFactory class KarlApplication: from starlette.types import Receive, Scope, Send def __init__(self) -> None: self._set_logging() _app = FastAPI(title="Karl", version="0.1.0") self._set_middlewares(_app) self._set_routes(_app) self._set_events(_app) self._init_services() self._app = _app async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: await self._app.__call__(scope, receive, send) def _set_logging(self): settings = get_settings() logging.addLevelName(5, "TRACE") logging.Logger.trace = lambda s, msg, *args, **kwargs: s.log(5, msg, *args, **kwargs) logging.basicConfig(level=settings.logging.level, handlers=HandlerFactory.create(HandlerFactory.Target.ALL, handler_prefix='karl.', file_path=settings.logging.path)) loggers = ( "uvicorn", "uvicorn.access", "uvicorn.error", "fastapi", "asyncio", "starlette", ) external_handlers = HandlerFactory.create(HandlerFactory.Target.ALL, file_path=settings.logging.path) for logger_name in loggers: logging_logger = logging.getLogger(logger_name) logging_logger.handlers = external_handlers logging_logger.propagate = False def _set_middlewares(self, app: FastAPI): from app.web.middlewares import LoggingMiddleware app.add_middleware(LoggingMiddleware) def _set_routes(self, app: FastAPI): from app.core.router import router as core_router app.include_router(core_router) from app.api.v1 import router as api_v1_router app.include_router(api_v1_router, prefix="/api/v1", tags=["v1"]) pass def _set_events(self, app: FastAPI): pass def _init_services(self): logger = logging.getLogger(__name__) load_injection_container() def run(): return KarlApplication() if __name__ == "__main__": import uvicorn settings = get_settings() uvicorn.run( "app.main:run", factory=True, host=settings.app.host, port=settings.app.port, reload=settings.app.reload, log_config=None, )