diff --git a/emrg/server/__main__.py b/emrg/server/__main__.py index 0b0a973a..65d00608 100644 --- a/emrg/server/__main__.py +++ b/emrg/server/__main__.py @@ -23,6 +23,10 @@ # Suppress noisy httpcore/httpx DEBUG logs (rant #24) logging.getLogger("httpcore").setLevel(logging.WARNING) logging.getLogger("httpx").setLevel(logging.WARNING) +# Suppress websockets frame-level DEBUG (rant 2026-08-06T10:21:26): +# 帧级收发日志占 emrgd.log ~90% 纯噪音。设 INFO 保留连接建立/关闭事件, +# 仅滤掉 DEBUG 帧收发(比 WARNING 更细——不丢连接生命周期信息)。 +logging.getLogger("websockets").setLevel(logging.INFO) from emrg.config import load_config from emrg.server.daemon import run_server diff --git a/emrg/server/daemon.py b/emrg/server/daemon.py index 33e3c03d..5f4ee885 100644 --- a/emrg/server/daemon.py +++ b/emrg/server/daemon.py @@ -40,6 +40,27 @@ ) from emrg.session import Session +# ── 日志脱敏(rant 2026-08-06T10:21:26)──────────────────────────── +# tool call 参数可能含 api_key/token/authorization/password 等敏感字段, +# 递归替换值为 ***,避免 emrgd.log 泄露凭据。 +_SENSITIVE_KEY_SUBSTRINGS = ( + "api_key", "token", "authorization", "password", "secret", + "api-key", "auth", "credential", "key", +) + + +def _redact(value): + """递归脱敏 dict/list 中的敏感字段值(就地不修改原对象)。""" + if isinstance(value, dict): + return { + k: ("***" if any(s in k.lower() for s in _SENSITIVE_KEY_SUBSTRINGS) + else _redact(v)) + for k, v in value.items() + } + if isinstance(value, list): + return [_redact(v) for v in value] + return value + from emrg.tools import ToolRegistry from emrg.tools.bash_tool import BashTool from emrg.tools.read_tool import ReadTool @@ -1378,7 +1399,7 @@ async def _run_tool_loop( args = {} logger.info("tool call: %s(%s)", tc_name, - json.dumps(args, ensure_ascii=False)[:200]) + json.dumps(_redact(args), ensure_ascii=False)[:200]) # Notify client (broadcast to all session subscribers) await self._broadcast(session.session_id, {