diff --git a/Dockerfile b/Dockerfile index b112284..7289ded 100644 --- a/Dockerfile +++ b/Dockerfile @@ -45,4 +45,4 @@ COPY ./backend . # Copy the frontend build COPY --from=builder /frontend/dist ./ui -ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0" ] +ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0", "--log-config", "log_config.json" ] diff --git a/backend/Dockerfile b/backend/Dockerfile index edf898e..371e807 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -29,4 +29,4 @@ COPY . . HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --start-interval=1s --retries=3 CMD [ "curl", "-f", "http://localhost:8000/health" ] -ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0" ] +ENTRYPOINT [ "uvicorn", "app.server:app", "--host", "0.0.0.0", "--log-config", "log_config.json" ] diff --git a/backend/Makefile b/backend/Makefile index 3e8dc5b..3f24ce3 100644 --- a/backend/Makefile +++ b/backend/Makefile @@ -14,7 +14,7 @@ build_ui: TEST_FILE ?= tests/unit_tests/ start: - poetry run uvicorn app.server:app --reload --port 8100 + poetry run uvicorn app.server:app --reload --port 8100 --log-config log_config.json migrate: migrate -database postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@$(POSTGRES_HOST):$(POSTGRES_PORT)/$(POSTGRES_DB)?sslmode=disable -path ./migrations up diff --git a/backend/app/lifespan.py b/backend/app/lifespan.py index 8e15f13..384249b 100644 --- a/backend/app/lifespan.py +++ b/backend/app/lifespan.py @@ -3,6 +3,7 @@ from contextlib import asynccontextmanager import asyncpg import orjson +import structlog from fastapi import FastAPI _pg_pool = None @@ -26,6 +27,23 @@ async def _init_connection(conn) -> None: @asynccontextmanager async def lifespan(app: FastAPI): + structlog.configure( + processors=[ + structlog.stdlib.filter_by_level, + structlog.stdlib.add_logger_name, + structlog.stdlib.add_log_level, + structlog.stdlib.PositionalArgumentsFormatter(), + structlog.processors.TimeStamper(fmt="iso"), + structlog.processors.StackInfoRenderer(), + structlog.processors.format_exc_info, + structlog.processors.UnicodeDecoder(), + structlog.stdlib.render_to_log_kwargs, + ], + logger_factory=structlog.stdlib.LoggerFactory(), + wrapper_class=structlog.stdlib.BoundLogger, + cache_logger_on_first_use=True, + ) + global _pg_pool _pg_pool = await asyncpg.create_pool(