""" Logging utilities for B2B Shopping AI Assistant """ import logging import sys from typing import Optional import structlog from structlog.types import Processor def setup_logging(level: str = "INFO") -> None: """Setup structured logging configuration""" # Configure standard library logging logging.basicConfig( format="%(message)s", stream=sys.stdout, level=getattr(logging, level.upper()), ) # Define processors for structlog shared_processors: list[Processor] = [ structlog.contextvars.merge_contextvars, structlog.processors.add_log_level, structlog.processors.TimeStamper(fmt="iso"), structlog.stdlib.PositionalArgumentsFormatter(), structlog.processors.StackInfoRenderer(), structlog.processors.UnicodeDecoder(), ] # Configure structlog 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, ) def get_logger(name: Optional[str] = None) -> structlog.stdlib.BoundLogger: """Get a structured logger instance Args: name: Logger name, defaults to module name Returns: Configured structlog logger """ return structlog.get_logger(name) # Create default logger logger = get_logger("agent")