Source code for hovel_sdk.logging

from __future__ import annotations

import logging
import traceback
from collections.abc import Callable
from typing import Any

_RESERVED = set(logging.LogRecord("", 0, "", 0, "", (), None).__dict__.keys())


class RPCLogHandler(logging.Handler):
    def __init__(self, emit: Callable[[dict[str, Any]], None]) -> None:
        super().__init__()
        self._emit = emit

    def emit(self, record: logging.LogRecord) -> None:
        fields: dict[str, Any] = {}
        for key, value in record.__dict__.items():
            if key.startswith("_") or key in _RESERVED:
                continue
            fields[key] = value
        params: dict[str, Any] = {
            "level": record.levelname.lower(),
            "message": record.getMessage(),
            "logger": record.name,
            "fields": fields,
        }
        if record.exc_info:
            params["exception"] = "".join(traceback.format_exception(*record.exc_info))
        self._emit(params)


[docs] def setup_logging(emit: Callable[[dict[str, Any]], None] | None = None) -> RPCLogHandler: if emit is None: def emit(_params: dict[str, Any]) -> None: return handler = RPCLogHandler(emit) root = logging.getLogger() root.addHandler(handler) root.setLevel(logging.INFO) return handler