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