/
pickling
/
mcp-sourcecontrol-python
Обзор
Документация
Войти
/
pickling
/
mcp-sourcecontrol-python
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/mcp_sourcecontrol/log.py
50 строк
2 KB
pickling-21
Python-порт mcp-sourcecontrol: 20 инструментов, stdio и Streamable HTTP
29 июл 2026, 02:18
29 июл 2026, 02:18
bc8bde4
Код
Авторство
О чём код?
"""Простой JSON-логгер, зеркало SimpleLogger из TS-версии. Отличие от оригинала: логи пишутся в stderr, а не stdout — в stdio-режиме stdout занят JSON-RPC-сообщениями MCP, и посторонние строки ломают транспорт. """ from __future__ import annotations import json import sys from datetime import UTC, datetime from typing import Any, Literal LogLevel = Literal["debug", "info", "warn", "error"] _LEVEL_ORDER: dict[str, int] = {"debug": 10, "info": 20, "warn": 30, "error": 40} class SimpleLogger: """Логгер с уровнями debug/info/warn/error; error пишется всегда.""" def __init__(self) -> None: self._level: LogLevel = "info" def set_level(self, level: LogLevel) -> None: if level in _LEVEL_ORDER: self._level = level def _log(self, level: LogLevel, message: str, data: dict[str, Any] | None = None) -> None: if _LEVEL_ORDER[level] < _LEVEL_ORDER[self._level]: return payload: dict[str, Any] = dict(data) if data else {} payload["message"] = message payload["timestamp"] = datetime.now(UTC).isoformat() print(json.dumps(payload, ensure_ascii=False, default=str), file=sys.stderr, flush=True) def debug(self, message: str, data: dict[str, Any] | None = None) -> None: self._log("debug", message, data) def info(self, message: str, data: dict[str, Any] | None = None) -> None: self._log("info", message, data) def warn(self, message: str, data: dict[str, Any] | None = None) -> None: self._log("warn", message, data) def error(self, message: str, data: dict[str, Any] | None = None) -> None: self._log("error", message, data) logger = SimpleLogger()