import logging import sys from typing import Any import structlog from src.infrastructure.config.settings import settings def configure_logging() -> None: shared_processors: list[Any] = [ structlog.contextvars.merge_contextvars, structlog.stdlib.add_log_level, structlog.stdlib.add_logger_name, structlog.processors.TimeStamper(fmt="iso"), structlog.processors.StackInfoRenderer(), structlog.processors.UnicodeDecoder(), ] if settings.LOG_JSON_FORMAT: renderer = structlog.processors.JSONRenderer() else: renderer = structlog.dev.ConsoleRenderer() structlog.configure( processors=[ *shared_processors, structlog.stdlib.ProcessorFormatter.wrap_for_formatter, ], logger_factory=structlog.stdlib.LoggerFactory(), wrapper_class=structlog.stdlib.BoundLogger, cache_logger_on_first_use=True, ) formatter = structlog.stdlib.ProcessorFormatter( processors=[ structlog.stdlib.ProcessorFormatter.remove_processors_meta, renderer, ], foreign_pre_chain=shared_processors, ) handler = logging.StreamHandler(sys.stdout) handler.setFormatter(formatter) root_logger = logging.getLogger() root_logger.handlers.clear() root_logger.addHandler(handler) root_logger.setLevel(settings.LOG_LEVEL.upper()) for noisy in ("uvicorn.access", "sqlalchemy.engine", "httpx", "aioredis"): logging.getLogger(noisy).setLevel(logging.WARNING) def get_logger(name: str | None = None) -> Any: return structlog.get_logger(name)