"""Structured logging with structlog — JSON in prod, pretty in dev.""" import logging import sys import structlog from src.config import settings def _configure() -> None: logging.basicConfig( format="%(message)s", stream=sys.stdout, level=settings.log_level.upper(), ) structlog.configure( processors=[ structlog.contextvars.merge_contextvars, structlog.processors.add_log_level, structlog.processors.TimeStamper(fmt="iso"), structlog.dev.ConsoleRenderer(), ], wrapper_class=structlog.make_filtering_bound_logger( logging.getLevelName(settings.log_level.upper()) ), context_class=dict, logger_factory=structlog.PrintLoggerFactory(), cache_logger_on_first_use=True, ) _configure() def get_logger(name: str) -> structlog.stdlib.BoundLogger: return structlog.get_logger(name)