diff --git a/ui_log_adapter.py b/ui_log_adapter.py index 3fb474620..8ea99ec83 100644 --- a/ui_log_adapter.py +++ b/ui_log_adapter.py @@ -15,7 +15,6 @@ if os.path.exists(ui_path): sys.path.insert(0, ui_path) try: from ui_logger import get_ui_logger - ui_logger = get_ui_logger("Bot") UI_LOGGER_AVAILABLE = True except ImportError: @@ -27,11 +26,61 @@ else: class UILogHandler(logging.Handler): """自定义日志处理器,将日志发送到UI""" - def __init__(self): + def __init__(self, max_retries=3): + """ + 初始化UI日志处理器 + + Args: + max_retries: 最大重试次数,默认3次 + """ super().__init__() self.ui_logger = ui_logger if UI_LOGGER_AVAILABLE else None + self.max_retries = max_retries + self.retry_delay = 0.1 # 重试延迟时间(秒) + + def _send_log_with_retry(self, msg, level): + """ + 带重试机制的日志发送方法 + + Args: + msg: 日志消息 + level: 日志级别('info', 'warning', 'error', 'debug') + + Returns: + bool: 发送是否成功 + """ + if not self.ui_logger: + return False + + for attempt in range(self.max_retries): + try: + if level == "info": + self.ui_logger.info(msg) + elif level == "warning": + self.ui_logger.warning(msg) + elif level == "error": + self.ui_logger.error(msg) + elif level == "debug": + self.ui_logger.debug(msg) + else: + self.ui_logger.info(msg) + + return True + except Exception as e: + if attempt == self.max_retries - 1: + print(f"[UI日志适配器] 发送日志失败,已达最大重试次数 {self.max_retries}: {e}") + return False + time.sleep(self.retry_delay) + + return False def emit(self, record): + """ + 处理日志记录(重写父类方法) + + Args: + record: 日志记录对象 + """ if not self.ui_logger: return @@ -46,28 +95,19 @@ class UILogHandler(logging.Handler): } ui_level = level_mapping.get(record.levelname, "info") - # 过滤掉过于频繁的调试信息 + # 过滤掉DEBUG日志 if record.levelname == "DEBUG": return - # 添加emoji前缀让日志更清晰 emoji_map = {"info": "📝", "warning": "⚠️", "error": "❌", "debug": "🔍"} - formatted_msg = f"{emoji_map.get(ui_level, '📝')} {msg}" - # print(f"[UI日志适配器] 正在发送日志: {ui_level} - {formatted_msg[:50]}...") - - if ui_level == "info": - self.ui_logger.info(formatted_msg) - elif ui_level == "warning": - self.ui_logger.warning(formatted_msg) - elif ui_level == "error": - self.ui_logger.error(formatted_msg) - elif ui_level == "debug": - self.ui_logger.debug(formatted_msg) + success = self._send_log_with_retry(formatted_msg, ui_level) + # 可选:记录发送状态 + # if not success: + # print(f"[UI日志适配器] 日志发送失败: {ui_level} - {formatted_msg[:50]}...") except Exception as e: - print(f"[UI日志适配器] emit失败: {e}") # 静默失败,不影响主程序 pass @@ -81,48 +121,40 @@ def setup_ui_logging(): try: print("[UI日志适配器] 开始设置UI日志处理器...") - # 获取Bot的根日志器 root_logger = logging.getLogger() - - # 检查是否已经添加过UI处理器 for handler in root_logger.handlers: if isinstance(handler, UILogHandler): print("[UI日志适配器] UI日志处理器已存在,跳过重复添加") return - # 创建UI日志处理器 - ui_handler = UILogHandler() - ui_handler.setLevel(logging.INFO) # 只捕获INFO及以上级别 - - # 添加到根日志器 + ui_handler = UILogHandler(max_retries=3) + ui_handler.setLevel(logging.INFO) root_logger.addHandler(ui_handler) print(f"[UI日志适配器] UI日志处理器已添加到根日志器,当前处理器数量: {len(root_logger.handlers)}") + print(f"[UI日志适配器] 最大重试次数: {ui_handler.max_retries}") # 发送启动信息 if UI_LOGGER_AVAILABLE: - ui_logger.info("Bot服务日志适配器已启动") - print("[UI日志适配器] 启动信息已发送到UI") + success = ui_handler._send_log_with_retry("📝 Bot服务日志适配器已启动", "info") + print("[UI日志适配器] 启动信息已发送到UI" if success else "[UI日志适配器] 启动信息发送失败") except Exception as e: print(f"[UI日志适配器] 设置失败: {e}") - # 静默失败 - pass -# 自动设置 +# 自动设置:模块被导入时执行 if __name__ != "__main__": print("[UI日志适配器] 模块被导入,准备设置UI日志...") - # 立即尝试设置,如果日志系统还未初始化则延迟执行 try: setup_ui_logging() except Exception as e: print(f"[UI日志适配器] 立即设置失败,将延迟执行: {e}") - # 延迟执行,确保主程序日志系统已初始化 def delayed_setup(): - time.sleep(1.0) # 延迟1秒 + """延迟设置函数,在独立线程中执行""" + time.sleep(0.5) # 等待日志系统初始化 print("[UI日志适配器] 执行延迟设置...") setup_ui_logging()