feat: 添加日志过滤功能,仅转发插件相关日志,忽略第三方库日志

This commit is contained in:
DrSmoothl
2026-03-12 22:03:43 +08:00
parent b17948a495
commit 793dee08d4

View File

@@ -58,6 +58,9 @@ class RunnerIPCLogHandler(logging.Handler):
#: 每次 send_event 携带的最大日志条数
FLUSH_BATCH_SIZE: int = 20
#: 仅转发 logger name 以这些前缀开头的日志,第三方库日志将被忽略
ALLOWED_LOGGER_PREFIXES: tuple[str, ...] = ("plugin.",)
def __init__(self) -> None:
super().__init__()
# deque(maxlen=N): append/popleft 在 CPython GIL 保护下线程安全
@@ -100,10 +103,15 @@ class RunnerIPCLogHandler(logging.Handler):
def emit(self, record: logging.LogRecord) -> None:
"""将一条 LogRecord 序列化后放入缓冲(同步,永不阻塞)。
仅转发 logger name 匹配 ``ALLOWED_LOGGER_PREFIXES`` 的日志,
第三方库日志被静默忽略,避免噪声淹没插件日志。
缓冲已满时deque 自动从左侧丢弃最旧条目FIFO 溢出)。
异常通过 ``self.handleError(record)`` 写到 stderr不引发。
"""
try:
# 过滤:仅允许插件相关的 logger跳过第三方库日志
if not any(record.name.startswith(p) for p in self.ALLOWED_LOGGER_PREFIXES):
return
# format() 触发 exc_info 格式化并将结果缓存到 record.exc_text
msg = self.format(record)
entry = LogEntry(