Spaces:
Sleeping
Sleeping
| """ | |
| server/logger.py — Structured JSON logging for all environment events. | |
| Every reset, step, query, apply, and error is logged with full context. | |
| """ | |
| import json | |
| import logging | |
| import sys | |
| import time | |
| from server.config import cfg | |
| def _json_formatter(record: logging.LogRecord) -> str: | |
| payload = { | |
| "ts": round(time.time(), 3), | |
| "level": record.levelname, | |
| "msg": record.getMessage(), | |
| } | |
| if hasattr(record, "extra"): | |
| payload.update(record.extra) | |
| return json.dumps(payload) | |
| class _JsonHandler(logging.StreamHandler): | |
| def emit(self, record: logging.LogRecord): | |
| try: | |
| print(_json_formatter(record), file=sys.stdout, flush=True) | |
| except Exception: | |
| self.handleError(record) | |
| def get_logger(name: str) -> logging.Logger: | |
| logger = logging.getLogger(name) | |
| if not logger.handlers: | |
| logger.setLevel(getattr(logging, cfg.LOG_LEVEL, logging.INFO)) | |
| logger.addHandler(_JsonHandler()) | |
| logger.propagate = False | |
| return logger | |
| def log_event(logger: logging.Logger, event: str, **kwargs): | |
| """Log a structured event with arbitrary key-value context.""" | |
| record = logging.LogRecord( | |
| name=logger.name, level=logging.INFO, | |
| pathname="", lineno=0, msg=event, args=(), exc_info=None, | |
| ) | |
| record.extra = {"event": event, **kwargs} | |
| logger.handle(record) | |