2025-05-31 07:50:10 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
"""
|
|
|
|
|
統一調試日誌模組
|
|
|
|
|
================
|
|
|
|
|
|
|
|
|
|
提供統一的調試日誌功能,確保調試輸出不會干擾 MCP 通信。
|
|
|
|
|
所有調試輸出都會發送到 stderr,並且只在調試模式啟用時才輸出。
|
|
|
|
|
|
|
|
|
|
使用方法:
|
|
|
|
|
```python
|
|
|
|
|
from .debug import debug_log
|
|
|
|
|
|
|
|
|
|
debug_log("這是一條調試信息")
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
環境變數控制:
|
|
|
|
|
- MCP_DEBUG=true/1/yes/on: 啟用調試模式
|
|
|
|
|
- MCP_DEBUG=false/0/no/off: 關閉調試模式(默認)
|
|
|
|
|
|
|
|
|
|
作者: Minidoracat
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
from typing import Any
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def debug_log(message: Any, prefix: str = "DEBUG") -> None:
|
|
|
|
|
"""
|
|
|
|
|
輸出調試訊息到標準錯誤,避免污染標準輸出
|
2025-06-11 03:25:08 +08:00
|
|
|
|
|
2025-05-31 07:50:10 +08:00
|
|
|
|
Args:
|
|
|
|
|
message: 要輸出的調試信息
|
|
|
|
|
prefix: 調試信息的前綴標識,默認為 "DEBUG"
|
|
|
|
|
"""
|
|
|
|
|
# 只在啟用調試模式時才輸出,避免干擾 MCP 通信
|
2025-06-11 03:25:08 +08:00
|
|
|
|
if os.getenv("MCP_DEBUG", "").lower() not in ("true", "1", "yes", "on"):
|
2025-05-31 07:50:10 +08:00
|
|
|
|
return
|
2025-06-11 03:25:08 +08:00
|
|
|
|
|
2025-05-31 07:50:10 +08:00
|
|
|
|
try:
|
|
|
|
|
# 確保消息是字符串類型
|
|
|
|
|
if not isinstance(message, str):
|
|
|
|
|
message = str(message)
|
2025-06-11 03:25:08 +08:00
|
|
|
|
|
2025-05-31 07:50:10 +08:00
|
|
|
|
# 安全地輸出到 stderr,處理編碼問題
|
|
|
|
|
try:
|
|
|
|
|
print(f"[{prefix}] {message}", file=sys.stderr, flush=True)
|
|
|
|
|
except UnicodeEncodeError:
|
|
|
|
|
# 如果遇到編碼問題,使用 ASCII 安全模式
|
2025-06-11 03:25:08 +08:00
|
|
|
|
safe_message = message.encode("ascii", errors="replace").decode("ascii")
|
2025-05-31 07:50:10 +08:00
|
|
|
|
print(f"[{prefix}] {safe_message}", file=sys.stderr, flush=True)
|
|
|
|
|
except Exception:
|
|
|
|
|
# 最後的備用方案:靜默失敗,不影響主程序
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def i18n_debug_log(message: Any) -> None:
|
|
|
|
|
"""國際化模組專用的調試日誌"""
|
|
|
|
|
debug_log(message, "I18N")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def server_debug_log(message: Any) -> None:
|
|
|
|
|
"""伺服器模組專用的調試日誌"""
|
|
|
|
|
debug_log(message, "SERVER")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def web_debug_log(message: Any) -> None:
|
|
|
|
|
"""Web UI 模組專用的調試日誌"""
|
|
|
|
|
debug_log(message, "WEB")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def is_debug_enabled() -> bool:
|
|
|
|
|
"""檢查是否啟用了調試模式"""
|
|
|
|
|
return os.getenv("MCP_DEBUG", "").lower() in ("true", "1", "yes", "on")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def set_debug_mode(enabled: bool) -> None:
|
|
|
|
|
"""設置調試模式(用於測試)"""
|
2025-06-11 03:25:08 +08:00
|
|
|
|
os.environ["MCP_DEBUG"] = "true" if enabled else "false"
|