import logging import json import sys from datetime import datetime, timezone class JsonFormatter(logging.Formatter): """ Outputs JSON-formatted logs suitable for Docker, Elastic, Loki, etc. """ def format(self, record): log_record = { "timestamp": datetime.now(timezone.utc).isoformat(), "level": record.levelname, "logger": record.name, "message": record.getMessage(), "module": record.module, "funcName": record.funcName, "lineNo": record.lineno, } if hasattr(record, "props"): log_record.update(record.props) if record.exc_info: log_record["exception"] = self.formatException(record.exc_info) return json.dumps(log_record) def get_logger(name: str) -> logging.Logger: logger = logging.getLogger(name) # Prevent duplicate handlers in Docker/Gunicorn/etc. if not logger.hasHandlers(): handler = logging.StreamHandler(sys.stdout) handler.setFormatter(JsonFormatter()) handler.setLevel(logging.INFO) logger.addHandler(handler) logger.setLevel(logging.INFO) logger.propagate = False return logger