""" Structured logging configuration. """ import logging import sys import json from datetime import datetime, timezone class JSONFormatter(logging.Formatter): """Emit log records as single-line JSON objects.""" def format(self, record: logging.LogRecord) -> str: log_entry = { "timestamp": datetime.now(timezone.utc).isoformat(), "level": record.levelname, "logger": record.name, "message": record.getMessage(), } if record.exc_info and record.exc_info[0] is not None: log_entry["exception"] = self.formatException(record.exc_info) return json.dumps(log_entry) def setup_logging(level: int = logging.INFO) -> None: """Configure root logger with structured JSON output to stderr.""" handler = logging.StreamHandler(sys.stderr) handler.setFormatter(JSONFormatter()) root = logging.getLogger() root.setLevel(level) root.addHandler(handler) # Quieten noisy third-party loggers logging.getLogger("uvicorn.access").setLevel(logging.WARNING) logging.getLogger("motor").setLevel(logging.WARNING) def get_logger(name: str) -> logging.Logger: """Return a named logger.""" return logging.getLogger(name)