# File Path: src/util/logger.py import inspect import logging from enum import Enum, auto import structlog from pythonjsonlogger import jsonlogger from requests.exceptions import HTTPError from structlog.types import EventDict from src.config import config def get_http_error_response( logger: logging.Logger, method_name: str, event_dict: EventDict ) -> EventDict: error = event_dict.get("error", None) if error and isinstance(error, HTTPError): event_dict["http_error"] = error.response.text return event_dict structlog.configure( processors=[ structlog.processors.TimeStamper(), structlog.stdlib.filter_by_level, structlog.stdlib.add_logger_name, structlog.stdlib.add_log_level, get_http_error_response, structlog.stdlib.PositionalArgumentsFormatter(), structlog.processors.StackInfoRenderer(), structlog.processors.format_exc_info, structlog.processors.UnicodeDecoder(), structlog.stdlib.render_to_log_kwargs, ], context_class=dict, logger_factory=structlog.stdlib.LoggerFactory(), wrapper_class=structlog.stdlib.BoundLogger, cache_logger_on_first_use=True, ) handler = logging.StreamHandler() handler.setFormatter(jsonlogger.JsonFormatter()) logger = logging.getLogger() logger.addHandler(handler) logger.setLevel(config.logging.log_level) def get_logger(): frm = inspect.stack()[1] mod = inspect.getmodule(frm[0]) return structlog.get_logger(mod.__name__) class LogEvents(Enum): def __str__(self) -> str: return self.name SOME_INFO_EVENT = auto() SOME_ERROR_EVENT = auto()