1. 统一为使用基于pydantic的.env环境变量管理配置

2. 全项目基于loguru进行日志管理
This commit is contained in:
Doiiars
2025-11-05 14:56:49 +08:00
parent 1d2e23d8c1
commit 537d682861
50 changed files with 1404 additions and 1731 deletions
+28 -27
View File
@@ -11,13 +11,14 @@ import re
import json
from typing import Dict, Optional, List
from threading import Lock
from loguru import logger
# 导入论坛主持人模块
try:
from .llm_host import generate_host_speech
HOST_AVAILABLE = True
except ImportError:
print("ForumEngine: 论坛主持人模块未找到,将以纯监控模式运行")
logger.warning("ForumEngine: 论坛主持人模块未找到,将以纯监控模式运行")
HOST_AVAILABLE = False
class LogMonitor:
@@ -76,7 +77,7 @@ class LogMonitor:
pass # 先创建空文件
self.write_to_forum_log(f"=== ForumEngine 监控开始 - {start_time} ===", "SYSTEM")
print(f"ForumEngine: forum.log 已清空并初始化")
logger.info(f"ForumEngine: forum.log 已清空并初始化")
# 重置JSON捕获状态
self.capturing_json = {}
@@ -88,7 +89,7 @@ class LogMonitor:
self.is_host_generating = False
except Exception as e:
print(f"ForumEngine: 清空forum.log失败: {e}")
logger.exception(f"ForumEngine: 清空forum.log失败: {e}")
def write_to_forum_log(self, content: str, source: str = None):
"""写入内容到forum.log(线程安全)"""
@@ -105,7 +106,7 @@ class LogMonitor:
f.write(f"[{timestamp}] {content_one_line}\n")
f.flush()
except Exception as e:
print(f"ForumEngine: 写入forum.log失败: {e}")
logger.exception(f"ForumEngine: 写入forum.log失败: {e}")
def is_target_log_line(self, line: str) -> bool:
"""检查是否是目标日志行(SummaryNode"""
@@ -241,7 +242,7 @@ class LogMonitor:
return f"清理后的输出: {json.dumps(json_obj, ensure_ascii=False, indent=2)}"
except Exception as e:
print(f"ForumEngine: 格式化JSON时出错: {e}")
logger.exception(f"ForumEngine: 格式化JSON时出错: {e}")
return f"清理后的输出: {json.dumps(json_obj, ensure_ascii=False, indent=2)}"
def extract_node_content(self, line: str) -> Optional[str]:
@@ -331,7 +332,7 @@ class LogMonitor:
new_lines = [line.strip() for line in new_lines if line.strip()]
except Exception as e:
print(f"ForumEngine: 读取{app_name}日志失败: {e}")
logger.exception(f"ForumEngine: 读取{app_name}日志失败: {e}")
return new_lines
@@ -406,7 +407,7 @@ class LogMonitor:
self.is_host_generating = False
return
print("ForumEngine: 正在生成主持人发言...")
logger.info("ForumEngine: 正在生成主持人发言...")
# 调用主持人生成发言(传入最近5条)
host_speech = generate_host_speech(recent_speeches)
@@ -414,18 +415,18 @@ class LogMonitor:
if host_speech:
# 写入主持人发言到forum.log
self.write_to_forum_log(host_speech, "HOST")
print(f"ForumEngine: 主持人发言已记录")
logger.info(f"ForumEngine: 主持人发言已记录")
# 清空已处理的5条发言
self.agent_speeches_buffer = self.agent_speeches_buffer[5:]
else:
print("ForumEngine: 主持人发言生成失败")
logger.error("ForumEngine: 主持人发言生成失败")
# 重置生成标志
self.is_host_generating = False
except Exception as e:
print(f"ForumEngine: 触发主持人发言时出错: {e}")
logger.exception(f"ForumEngine: 触发主持人发言时出错: {e}")
self.is_host_generating = False
def _clean_content_tags(self, content: str, app_name: str) -> str:
@@ -453,7 +454,7 @@ class LogMonitor:
def monitor_logs(self):
"""智能监控日志文件"""
print("ForumEngine: 论坛创建中...")
logger.info("ForumEngine: 论坛创建中...")
# 初始化文件行数和位置 - 记录当前状态作为基线
for app_name, log_file in self.monitored_logs.items():
@@ -461,7 +462,7 @@ class LogMonitor:
self.file_positions[app_name] = self.get_file_size(log_file)
self.capturing_json[app_name] = False
self.json_buffer[app_name] = []
# print(f"ForumEngine: {app_name} 基线行数: {self.file_line_counts[app_name]}")
# logger.info(f"ForumEngine: {app_name} 基线行数: {self.file_line_counts[app_name]}")
while self.is_monitoring:
try:
@@ -484,7 +485,7 @@ class LogMonitor:
if not self.is_searching:
for line in new_lines:
if line.strip() and 'FirstSummaryNode' in line:
print(f"ForumEngine: 在{app_name}中检测到第一次论坛发表内容")
logger.info(f"ForumEngine: 在{app_name}中检测到第一次论坛发表内容")
self.is_searching = True
self.search_inactive_count = 0
# 清空forum.log开始新会话
@@ -500,7 +501,7 @@ class LogMonitor:
# 将app_name转换为大写作为标签(如 insight -> INSIGHT
source_tag = app_name.upper()
self.write_to_forum_log(content, source_tag)
# print(f"ForumEngine: 捕获 - {content}")
# logger.info(f"ForumEngine: 捕获 - {content}")
captured_any = True
# 将发言添加到缓冲区(格式化为完整的日志行)
@@ -515,7 +516,7 @@ class LogMonitor:
elif current_lines < previous_lines:
any_shrink = True
# print(f"ForumEngine: 检测到 {app_name} 日志缩短,将重置基线")
# logger.info(f"ForumEngine: 检测到 {app_name} 日志缩短,将重置基线")
# 重置文件位置到新的文件末尾
self.file_positions[app_name] = self.get_file_size(log_file)
# 重置JSON捕获状态
@@ -529,7 +530,7 @@ class LogMonitor:
if self.is_searching:
if any_shrink:
# log变短,结束当前搜索会话,重置为等待状态
# print("ForumEngine: 日志缩短,结束当前搜索会话,回到等待状态")
# logger.info("ForumEngine: 日志缩短,结束当前搜索会话,回到等待状态")
self.is_searching = False
self.search_inactive_count = 0
# 重置主持人相关状态
@@ -538,12 +539,12 @@ class LogMonitor:
# 写入结束标记
end_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.write_to_forum_log(f"=== ForumEngine 论坛结束 - {end_time} ===", "SYSTEM")
# print("ForumEngine: 已重置基线,等待下次FirstSummaryNode触发")
# logger.info("ForumEngine: 已重置基线,等待下次FirstSummaryNode触发")
elif not any_growth and not captured_any:
# 没有增长也没有捕获内容,增加非活跃计数
self.search_inactive_count += 1
if self.search_inactive_count >= 900: # 15分钟无活动才结束
print("ForumEngine: 长时间无活动,结束论坛")
logger.info("ForumEngine: 长时间无活动,结束论坛")
self.is_searching = False
self.search_inactive_count = 0
# 重置主持人相关状态
@@ -559,17 +560,17 @@ class LogMonitor:
time.sleep(1)
except Exception as e:
print(f"ForumEngine: 论坛记录中出错: {e}")
logger.exception(f"ForumEngine: 论坛记录中出错: {e}")
import traceback
traceback.print_exc()
time.sleep(2)
print("ForumEngine: 停止论坛日志文件")
logger.info("ForumEngine: 停止论坛日志文件")
def start_monitoring(self):
"""开始智能监控"""
if self.is_monitoring:
print("ForumEngine: 论坛已经在运行中")
logger.info("ForumEngine: 论坛已经在运行中")
return False
try:
@@ -578,18 +579,18 @@ class LogMonitor:
self.monitor_thread = threading.Thread(target=self.monitor_logs, daemon=True)
self.monitor_thread.start()
print("ForumEngine: 论坛已启动")
logger.info("ForumEngine: 论坛已启动")
return True
except Exception as e:
print(f"ForumEngine: 启动论坛失败: {e}")
logger.exception(f"ForumEngine: 启动论坛失败: {e}")
self.is_monitoring = False
return False
def stop_monitoring(self):
"""停止监控"""
if not self.is_monitoring:
print("ForumEngine: 论坛未运行")
logger.info("ForumEngine: 论坛未运行")
return
try:
@@ -602,10 +603,10 @@ class LogMonitor:
end_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
self.write_to_forum_log(f"=== ForumEngine 论坛结束 - {end_time} ===", "SYSTEM")
print("ForumEngine: 论坛已停止")
logger.info("ForumEngine: 论坛已停止")
except Exception as e:
print(f"ForumEngine: 停止论坛失败: {e}")
logger.exception(f"ForumEngine: 停止论坛失败: {e}")
def get_forum_log_content(self) -> List[str]:
"""获取forum.log的内容"""
@@ -617,7 +618,7 @@ class LogMonitor:
return [line.rstrip('\n\r') for line in f.readlines()]
except Exception as e:
print(f"ForumEngine: 读取forum.log失败: {e}")
logger.exception(f"ForumEngine: 读取forum.log失败: {e}")
return []
def fix_json_string(self, json_text: str) -> str: