|
19 | 19 | and configuration for the sandbox lifecycle management service. |
20 | 20 | """ |
21 | 21 |
|
22 | | -import logging |
| 22 | +import copy |
| 23 | +import logging.config |
23 | 24 | from typing import Any |
24 | 25 |
|
25 | 26 | from fastapi import FastAPI, Request |
|
28 | 29 | from fastapi.responses import JSONResponse |
29 | 30 |
|
30 | 31 | from src.config import load_config |
| 32 | +from uvicorn.config import LOGGING_CONFIG as UVICORN_LOGGING_CONFIG |
31 | 33 |
|
32 | 34 | # Load configuration before initializing routers/middleware |
33 | 35 | app_config = load_config() |
34 | | -logging.basicConfig(level=getattr(logging, app_config.server.log_level.upper(), logging.INFO)) |
| 36 | + |
| 37 | +# Unify logging format (including uvicorn access/error logs) with timestamp prefix. |
| 38 | +_log_config = copy.deepcopy(UVICORN_LOGGING_CONFIG) |
| 39 | +_fmt = "%(levelprefix)s %(asctime)s %(name)s: %(message)s" |
| 40 | +_datefmt = "%Y-%m-%d %H:%M:%S%z" |
| 41 | + |
| 42 | +# Enable colors and set format for both default and access loggers |
| 43 | +_log_config["formatters"]["default"]["fmt"] = _fmt |
| 44 | +_log_config["formatters"]["default"]["datefmt"] = _datefmt |
| 45 | +_log_config["formatters"]["default"]["use_colors"] = True |
| 46 | + |
| 47 | +_log_config["formatters"]["access"]["fmt"] = _fmt |
| 48 | +_log_config["formatters"]["access"]["datefmt"] = _datefmt |
| 49 | +_log_config["formatters"]["access"]["use_colors"] = True |
| 50 | + |
| 51 | +# Ensure project loggers (src.*) emit at configured level using the default handler. |
| 52 | +_log_config["loggers"]["src"] = { |
| 53 | + "handlers": ["default"], |
| 54 | + "level": app_config.server.log_level.upper(), |
| 55 | + "propagate": False, |
| 56 | +} |
| 57 | + |
| 58 | +logging.config.dictConfig(_log_config) |
| 59 | +logging.getLogger().setLevel( |
| 60 | + getattr(logging, app_config.server.log_level.upper(), logging.INFO) |
| 61 | +) |
35 | 62 |
|
36 | 63 | from src.api.lifecycle import router # noqa: E402 |
37 | 64 | from src.middleware.auth import AuthMiddleware # noqa: E402 |
@@ -113,4 +140,5 @@ async def health_check(): |
113 | 140 | host=app_config.server.host, |
114 | 141 | port=app_config.server.port, |
115 | 142 | reload=True, |
| 143 | + log_config=_log_config, |
116 | 144 | ) |
0 commit comments