"""Logging adapter for python-pdp-sdk with automatic extra kwargs injection.""" from __future__ import annotations import logging from typing import Any, MutableMapping _DEFAULT_EXTRA_KWARGS: dict[str, Any] = { "library": { "name": "python-pdp-sdk", "language": "python", } } class PdpSdkLoggerAdapter(logging.LoggerAdapter[logging.Logger]): """Logger adapter that automatically merges extra kwargs. Combines global defaults, instance-level extras, and per-call extras. Later extras override earlier ones in case of conflicts. """ def process( self, msg: str, kwargs: MutableMapping[str, Any] ) -> tuple[str, MutableMapping[str, Any]]: """Process the logging call, merging all extra kwargs.""" merged_extra = _DEFAULT_EXTRA_KWARGS.copy() if self.extra: merged_extra.update(self.extra) if "extra" in kwargs: merged_extra.update(kwargs["extra"]) kwargs["extra"] = merged_extra return msg, kwargs def get_logger(name: str, extra: dict[str, Any] | None = None) -> PdpSdkLoggerAdapter: """Get a logger adapter with automatic extra kwargs injection. Args: ---- name: Logger name (typically __name__) extra: Optional instance-level extra kwargs to include in all logs Returns: ------- PdpSdkLoggerAdapter instance """ base_logger = logging.getLogger(name) return PdpSdkLoggerAdapter(base_logger, extra or {})