Spaces:
Sleeping
Sleeping
File size: 1,389 Bytes
c30a2f3 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | """
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)
|