"""Structured logging configuration.""" import logging import sys from typing import Any import structlog from structlog.types import Processor from app.core.config import settings def configure_logging() -> None: """Configure structured logging.""" # Standard library logging logging.basicConfig( format="%(message)s", stream=sys.stdout, level=getattr(logging, settings.LOG_LEVEL.upper()), ) # Structlog processors processors: list[Processor] = [ structlog.contextvars.merge_contextvars, structlog.stdlib.add_log_level, structlog.stdlib.add_logger_name, structlog.processors.TimeStamper(fmt="iso"), structlog.processors.StackInfoRenderer(), structlog.processors.format_exc_info, ] if settings.DEBUG: processors.append(structlog.dev.ConsoleRenderer()) else: processors.append(structlog.processors.JSONRenderer()) structlog.configure( processors=processors, wrapper_class=structlog.stdlib.BoundLogger, context_class=dict, logger_factory=structlog.stdlib.LoggerFactory(), cache_logger_on_first_use=True, ) def get_logger(*args: Any, **kwargs: Any) -> structlog.BoundLogger: """Get a structured logger instance.""" return structlog.get_logger(*args, **kwargs)