import json import logging from datetime import UTC, datetime class JSONFormatter(logging.Formatter): def format(self, record: logging.LogRecord) -> str: log_data = { 'timestamp': datetime.fromtimestamp(record.created, UTC).isoformat(), 'level': record.levelname, 'message': record.getMessage(), 'module': record.module, 'package': record.name, 'app_name': record.app_name, 'app_version': record.app_version, } if record.levelno >= logging.ERROR: log_data['location'] = f'{record.pathname}:{record.lineno}' if record.exc_info: log_data['error_type'] = record.exc_info[0].__name__ log_data['error_message'] = str(record.exc_info[1]) log_data['traceback'] = self.formatException(record.exc_info) for key, value in record.__dict__.items(): if key not in { 'name', 'msg', 'args', 'created', 'filename', 'funcName', 'levelname', 'levelno', 'lineno', 'module', 'msecs', 'message', 'pathname', 'process', 'processName', 'relativeCreated', 'thread', 'threadName', 'exc_info', 'exc_text', 'stack_info', 'app_name', 'app_version', }: log_data[key] = value return json.dumps(log_data, ensure_ascii=False)