From f3fef69968fe87acc4d34c668d652cc2adf2a9c2 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 02:45:41 +0800 Subject: [PATCH 01/13] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9Elogger=E5=B7=A5?= =?UTF-8?q?=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 127 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/common/logger.py diff --git a/src/common/logger.py b/src/common/logger.py new file mode 100644 index 000000000..6093920f0 --- /dev/null +++ b/src/common/logger.py @@ -0,0 +1,127 @@ +from loguru import logger +from typing import Dict, Optional, Union, List, Any +import sys +from types import ModuleType +from pathlib import Path + + +# 类型别名 +LoguruLogger = logger.__class__ + +# 全局注册表:记录模块与处理器ID的映射 +_handler_registry: Dict[str, List[int]] = {} + +# 获取日志存储根地址 +current_file_path = Path(__file__).resolve() +PROJECT_ROOT = current_file_path.parent.parent.parent +LOG_ROOT = str(PROJECT_ROOT / "logs") + +# 默认全局配置 +DEFAULT_CONFIG = { + + # 日志级别配置 + "level": "INFO", # 全局基础日志级别(若未指定console/file_level则生效) + "console_level": "INFO", # 控制台默认级别(可覆盖) + "file_level": "DEBUG", # 文件默认级别(可覆盖) + + # 格式配置 + "console_format": ( + "{time:YYYY-MM-DD HH:mm:ss} | " + "{level: <8} | " + "{extra[module]: <20} | " + "{message}" + ), + "file_format": ( + "{time:YYYY-MM-DD HH:mm:ss} | " + "{level: <8} | " + "{extra[module]: <20} | " + "{message}" + ), + "log_dir": LOG_ROOT, # 默认日志目录,需保留 + "rotation": "100 MB", # 设定轮转 + "retention": "7 days", # 设定时长 + "compression": "zip", # 设定压缩 +} + + +class LogConfig: + """日志配置类""" + + def __init__(self, **kwargs): + self.config = DEFAULT_CONFIG.copy() + self.config.update(kwargs) + + def to_dict(self) -> dict: + return self.config.copy() + + def update(self, **kwargs): + self.config.update(kwargs) + + +def get_module_logger( + module: Union[str, ModuleType], + *, + console_level: Optional[str] = None, + file_level: Optional[str] = None, + extra_handlers: Optional[List[dict]] = None, + config: Optional[LogConfig] = None +) -> LoguruLogger: + module_name = module if isinstance(module, str) else module.__name__ + current_config = config.config if config else DEFAULT_CONFIG + + # 若模块已注册,先移除旧处理器(避免重复添加) + if module_name in _handler_registry: + for handler_id in _handler_registry[module_name]: + logger.remove(handler_id) + del _handler_registry[module_name] + + handler_ids = [] + + # 控制台处理器 + console_id = logger.add( + sink=sys.stderr, + level=console_level or current_config["console_level"], + format=current_config["console_format"], + filter=lambda record: record["extra"].get("module") == module_name, + enqueue=current_config.get("enqueue", True), + backtrace=current_config.get("backtrace", False), + diagnose=current_config.get("diagnose", False), + ) + handler_ids.append(console_id) + + # 文件处理器 + log_dir = Path(current_config["log_dir"]) + log_dir.mkdir(parents=True, exist_ok=True) + log_file = log_dir / f"{module_name}_{{time:YYYY-MM-DD}}.log" + + file_id = logger.add( + sink=str(log_file), + level=file_level or current_config["file_level"], + format=current_config["file_format"], + rotation=current_config["rotation"], + retention=current_config["retention"], + compression=current_config["compression"], + encoding=current_config.get("encoding", "utf-8"), + filter=lambda record: record["extra"].get("module") == module_name, + enqueue=current_config.get("enqueue", True), + ) + handler_ids.append(file_id) + + # 额外处理器 + if extra_handlers: + for handler in extra_handlers: + handler_id = logger.add(**handler) + handler_ids.append(handler_id) + + # 更新注册表 + _handler_registry[module_name] = handler_ids + + return logger.bind(module=module_name) + + +def remove_module_logger(module_name: str) -> None: + """清理指定模块的日志处理器""" + if module_name in _handler_registry: + for handler_id in _handler_registry[module_name]: + logger.remove(handler_id) + del _handler_registry[module_name] \ No newline at end of file From 77df50e66658e5c608972a2481cf78d069345ae3 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 02:46:38 +0800 Subject: [PATCH 02/13] =?UTF-8?q?reformat:=20=E6=A0=BC=E5=BC=8F=E5=8C=96me?= =?UTF-8?q?mory.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/memory_system/memory.py | 135 ++++++++++++++-------------- 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/src/plugins/memory_system/memory.py b/src/plugins/memory_system/memory.py index 0952e0024..47066ead5 100644 --- a/src/plugins/memory_system/memory.py +++ b/src/plugins/memory_system/memory.py @@ -27,6 +27,7 @@ logger = log_module.setup_logger(LogClassification.MEMORY) logger.info("初始化记忆系统") + class Memory_graph: def __init__(self): self.G = nx.Graph() # 使用 networkx 的图结构 @@ -35,9 +36,9 @@ class Memory_graph: # 避免自连接 if concept1 == concept2: return - + current_time = datetime.datetime.now().timestamp() - + # 如果边已存在,增加 strength if self.G.has_edge(concept1, concept2): self.G[concept1][concept2]['strength'] = self.G[concept1][concept2].get('strength', 1) + 1 @@ -45,14 +46,14 @@ class Memory_graph: self.G[concept1][concept2]['last_modified'] = current_time else: # 如果是新边,初始化 strength 为 1 - self.G.add_edge(concept1, concept2, - strength=1, - created_time=current_time, # 添加创建时间 - last_modified=current_time) # 添加最后修改时间 + self.G.add_edge(concept1, concept2, + strength=1, + created_time=current_time, # 添加创建时间 + last_modified=current_time) # 添加最后修改时间 def add_dot(self, concept, memory): current_time = datetime.datetime.now().timestamp() - + if concept in self.G: if 'memory_items' in self.G.nodes[concept]: if not isinstance(self.G.nodes[concept]['memory_items'], list): @@ -68,10 +69,10 @@ class Memory_graph: self.G.nodes[concept]['last_modified'] = current_time else: # 如果是新节点,创建新的记忆列表 - self.G.add_node(concept, - memory_items=[memory], - created_time=current_time, # 添加创建时间 - last_modified=current_time) # 添加最后修改时间 + self.G.add_node(concept, + memory_items=[memory], + created_time=current_time, # 添加创建时间 + last_modified=current_time) # 添加最后修改时间 def get_dot(self, concept): # 检查节点是否存在于图中 @@ -210,12 +211,13 @@ class Hippocampus: # 成功抽取短期消息样本 # 数据写回:增加记忆次数 for message in messages: - db.messages.update_one({"_id": message["_id"]}, {"$set": {"memorized_times": message["memorized_times"] + 1}}) + db.messages.update_one({"_id": message["_id"]}, + {"$set": {"memorized_times": message["memorized_times"] + 1}}) return messages try_count += 1 # 三次尝试均失败 return None - + def get_memory_sample(self, chat_size=20, time_frequency: dict = {'near': 2, 'mid': 4, 'far': 3}): """获取记忆样本 @@ -225,7 +227,7 @@ class Hippocampus: # 硬编码:每条消息最大记忆次数 # 如有需求可写入global_config max_memorized_time_per_msg = 3 - + current_timestamp = datetime.datetime.now().timestamp() chat_samples = [] @@ -324,20 +326,20 @@ class Hippocampus: # 为每个话题查找相似的已存在主题 existing_topics = list(self.memory_graph.G.nodes()) similar_topics = [] - + for existing_topic in existing_topics: topic_words = set(jieba.cut(topic)) existing_words = set(jieba.cut(existing_topic)) - + all_words = topic_words | existing_words v1 = [1 if word in topic_words else 0 for word in all_words] v2 = [1 if word in existing_words else 0 for word in all_words] - + similarity = cosine_similarity(v1, v2) - + if similarity >= 0.6: similar_topics.append((existing_topic, similarity)) - + similar_topics.sort(key=lambda x: x[1], reverse=True) similar_topics = similar_topics[:5] similar_topics_dict[topic] = similar_topics @@ -358,7 +360,7 @@ class Hippocampus: async def operation_build_memory(self, chat_size=20): time_frequency = {'near': 1, 'mid': 4, 'far': 4} memory_samples = self.get_memory_sample(chat_size, time_frequency) - + for i, messages in enumerate(memory_samples, 1): all_topics = [] # 加载进度可视化 @@ -371,14 +373,14 @@ class Hippocampus: compress_rate = global_config.memory_compress_rate compressed_memory, similar_topics_dict = await self.memory_compress(messages, compress_rate) logger.info(f"压缩后记忆数量: {len(compressed_memory)},似曾相识的话题: {len(similar_topics_dict)}") - + current_time = datetime.datetime.now().timestamp() - + for topic, memory in compressed_memory: logger.info(f"添加节点: {topic}") self.memory_graph.add_dot(topic, memory) all_topics.append(topic) - + # 连接相似的已存在主题 if topic in similar_topics_dict: similar_topics = similar_topics_dict[topic] @@ -386,11 +388,11 @@ class Hippocampus: if topic != similar_topic: strength = int(similarity * 10) logger.info(f"连接相似节点: {topic} 和 {similar_topic} (强度: {strength})") - self.memory_graph.G.add_edge(topic, similar_topic, - strength=strength, - created_time=current_time, - last_modified=current_time) - + self.memory_graph.G.add_edge(topic, similar_topic, + strength=strength, + created_time=current_time, + last_modified=current_time) + # 连接同批次的相关话题 for i in range(len(all_topics)): for j in range(i + 1, len(all_topics)): @@ -416,7 +418,7 @@ class Hippocampus: # 计算内存中节点的特征值 memory_hash = self.calculate_node_hash(concept, memory_items) - + # 获取时间信息 created_time = data.get('created_time', datetime.datetime.now().timestamp()) last_modified = data.get('last_modified', datetime.datetime.now().timestamp()) @@ -466,7 +468,7 @@ class Hippocampus: edge_hash = self.calculate_edge_hash(source, target) edge_key = (source, target) strength = data.get('strength', 1) - + # 获取边的时间信息 created_time = data.get('created_time', datetime.datetime.now().timestamp()) last_modified = data.get('last_modified', datetime.datetime.now().timestamp()) @@ -499,7 +501,7 @@ class Hippocampus: """从数据库同步数据到内存中的图结构""" current_time = datetime.datetime.now().timestamp() need_update = False - + # 清空当前图 self.memory_graph.G.clear() @@ -510,7 +512,7 @@ class Hippocampus: memory_items = node.get('memory_items', []) if not isinstance(memory_items, list): memory_items = [memory_items] if memory_items else [] - + # 检查时间字段是否存在 if 'created_time' not in node or 'last_modified' not in node: need_update = True @@ -520,22 +522,22 @@ class Hippocampus: update_data['created_time'] = current_time if 'last_modified' not in node: update_data['last_modified'] = current_time - + db.graph_data.nodes.update_one( {'concept': concept}, {'$set': update_data} ) logger.info(f"[时间更新] 节点 {concept} 添加缺失的时间字段") - + # 获取时间信息(如果不存在则使用当前时间) created_time = node.get('created_time', current_time) last_modified = node.get('last_modified', current_time) - + # 添加节点到图中 - self.memory_graph.G.add_node(concept, - memory_items=memory_items, - created_time=created_time, - last_modified=last_modified) + self.memory_graph.G.add_node(concept, + memory_items=memory_items, + created_time=created_time, + last_modified=last_modified) # 从数据库加载所有边 edges = list(db.graph_data.edges.find()) @@ -543,7 +545,7 @@ class Hippocampus: source = edge['source'] target = edge['target'] strength = edge.get('strength', 1) - + # 检查时间字段是否存在 if 'created_time' not in edge or 'last_modified' not in edge: need_update = True @@ -553,24 +555,24 @@ class Hippocampus: update_data['created_time'] = current_time if 'last_modified' not in edge: update_data['last_modified'] = current_time - + db.graph_data.edges.update_one( {'source': source, 'target': target}, {'$set': update_data} ) logger.info(f"[时间更新] 边 {source} - {target} 添加缺失的时间字段") - + # 获取时间信息(如果不存在则使用当前时间) created_time = edge.get('created_time', current_time) last_modified = edge.get('last_modified', current_time) - + # 只有当源节点和目标节点都存在时才添加边 if source in self.memory_graph.G and target in self.memory_graph.G: - self.memory_graph.G.add_edge(source, target, - strength=strength, - created_time=created_time, - last_modified=last_modified) - + self.memory_graph.G.add_edge(source, target, + strength=strength, + created_time=created_time, + last_modified=last_modified) + if need_update: logger.success("[数据库] 已为缺失的时间字段进行补充") @@ -578,44 +580,44 @@ class Hippocampus: """随机选择图中一定比例的节点和边进行检查,根据时间条件决定是否遗忘""" # 检查数据库是否为空 # logger.remove() - + logger.info(f"[遗忘] 开始检查数据库... 当前Logger信息:") # logger.info(f"- Logger名称: {logger.name}") logger.info(f"- Logger等级: {logger.level}") # logger.info(f"- Logger处理器: {[handler.__class__.__name__ for handler in logger.handlers]}") - + # logger2 = setup_logger(LogModule.MEMORY) # logger2.info(f"[遗忘] 开始检查数据库... 当前Logger信息:") # logger.info(f"[遗忘] 开始检查数据库... 当前Logger信息:") - + all_nodes = list(self.memory_graph.G.nodes()) all_edges = list(self.memory_graph.G.edges()) - + if not all_nodes and not all_edges: logger.info("[遗忘] 记忆图为空,无需进行遗忘操作") return - + check_nodes_count = max(1, int(len(all_nodes) * percentage)) check_edges_count = max(1, int(len(all_edges) * percentage)) - + nodes_to_check = random.sample(all_nodes, check_nodes_count) edges_to_check = random.sample(all_edges, check_edges_count) - + edge_changes = {'weakened': 0, 'removed': 0} node_changes = {'reduced': 0, 'removed': 0} - + current_time = datetime.datetime.now().timestamp() - + # 检查并遗忘连接 logger.info("[遗忘] 开始检查连接...") for source, target in edges_to_check: edge_data = self.memory_graph.G[source][target] last_modified = edge_data.get('last_modified') - - if current_time - last_modified > 3600*global_config.memory_forget_time: + + if current_time - last_modified > 3600 * global_config.memory_forget_time: current_strength = edge_data.get('strength', 1) new_strength = current_strength - 1 - + if new_strength <= 0: self.memory_graph.G.remove_edge(source, target) edge_changes['removed'] += 1 @@ -625,23 +627,23 @@ class Hippocampus: edge_data['last_modified'] = current_time edge_changes['weakened'] += 1 logger.info(f"[遗忘] 连接减弱: {source} -> {target} (强度: {current_strength} -> {new_strength})") - + # 检查并遗忘话题 logger.info("[遗忘] 开始检查节点...") for node in nodes_to_check: node_data = self.memory_graph.G.nodes[node] last_modified = node_data.get('last_modified', current_time) - - if current_time - last_modified > 3600*24: + + if current_time - last_modified > 3600 * 24: memory_items = node_data.get('memory_items', []) if not isinstance(memory_items, list): memory_items = [memory_items] if memory_items else [] - + if memory_items: current_count = len(memory_items) removed_item = random.choice(memory_items) memory_items.remove(removed_item) - + if memory_items: self.memory_graph.G.nodes[node]['memory_items'] = memory_items self.memory_graph.G.nodes[node]['last_modified'] = current_time @@ -651,7 +653,7 @@ class Hippocampus: self.memory_graph.G.remove_node(node) node_changes['removed'] += 1 logger.info(f"[遗忘] 节点移除: {node}") - + if any(count > 0 for count in edge_changes.values()) or any(count > 0 for count in node_changes.values()): self.sync_memory_to_db() logger.info("[遗忘] 统计信息:") @@ -943,6 +945,7 @@ def segment_text(text): seg_text = list(jieba.cut(text)) return seg_text + driver = get_driver() config = driver.config From 9b72b5a996e486b23cc8f2c042fdf1d255fc569d Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 04:19:20 +0800 Subject: [PATCH 03/13] =?UTF-8?q?refactor:=20=E4=B8=BB=E7=A8=8B=E5=BA=8Fbo?= =?UTF-8?q?t.py=E6=97=A5=E5=BF=97=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/bot.py b/bot.py index 7a97f485e..50d04fd08 100644 --- a/bot.py +++ b/bot.py @@ -10,10 +10,11 @@ import uvicorn from dotenv import load_dotenv from nonebot.adapters.onebot.v11 import Adapter import platform -from src.plugins.utils.logger_config import LogModule, LogClassification +from src.common.logger import get_module_logger -# 配置日志格式 +# 配置主程序日志格式 +logger = get_module_logger("主程序") # 获取没有加载env时的环境变量 env_mask = {key: os.getenv(key) for key in os.environ} @@ -76,11 +77,11 @@ def init_env(): def load_env(): # 使用闭包实现对加载器的横向扩展,避免大量重复判断 def prod(): - logger.success("加载生产环境变量配置") + logger.success("成功加载生产环境变量配置") load_dotenv(".env.prod", override=True) # override=True 允许覆盖已存在的环境变量 def dev(): - logger.success("加载开发环境变量配置") + logger.success("成功加载开发环境变量配置") load_dotenv(".env.dev", override=True) # override=True 允许覆盖已存在的环境变量 fn_map = {"prod": prod, "dev": dev} @@ -100,11 +101,6 @@ def load_env(): RuntimeError(f"ENVIRONMENT 配置错误,请检查 .env 文件中的 ENVIRONMENT 变量及对应 .env.{env} 是否存在") -def load_logger(): - global logger # 使得bot.py中其他函数也能调用 - log_module = LogModule() - logger = log_module.setup_logger(LogClassification.BASE) - def scan_provider(env_config: dict): provider = {} @@ -206,8 +202,6 @@ def raw_main(): if __name__ == "__main__": try: - # 配置日志,使得主程序直接退出时候也能访问logger - load_logger() raw_main() app = nonebot.get_asgi() From ddb8ea6610f1592c6cc78656a5b07be2acbbb357 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 04:22:31 +0800 Subject: [PATCH 04/13] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=B7=A5=E5=8E=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/common/logger.py b/src/common/logger.py index 6093920f0..4808fc77e 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -1,9 +1,10 @@ from loguru import logger -from typing import Dict, Optional, Union, List, Any +from typing import Dict, Optional, Union, List import sys from types import ModuleType from pathlib import Path +# logger.remove() # 类型别名 LoguruLogger = logger.__class__ @@ -13,22 +14,20 @@ _handler_registry: Dict[str, List[int]] = {} # 获取日志存储根地址 current_file_path = Path(__file__).resolve() -PROJECT_ROOT = current_file_path.parent.parent.parent -LOG_ROOT = str(PROJECT_ROOT / "logs") +LOG_ROOT = "logs" # 默认全局配置 DEFAULT_CONFIG = { # 日志级别配置 - "level": "INFO", # 全局基础日志级别(若未指定console/file_level则生效) - "console_level": "INFO", # 控制台默认级别(可覆盖) + "console_level": "DEBUG", # 控制台默认级别(可覆盖) "file_level": "DEBUG", # 文件默认级别(可覆盖) # 格式配置 "console_format": ( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " - "{extra[module]: <20} | " + "{extra[module]: <4} | " "{message}" ), "file_format": ( @@ -124,4 +123,4 @@ def remove_module_logger(module_name: str) -> None: if module_name in _handler_registry: for handler_id in _handler_registry[module_name]: logger.remove(handler_id) - del _handler_registry[module_name] \ No newline at end of file + del _handler_registry[module_name] From e6ef2e55e3fd61c411954dd45df46c2eebdb0486 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 14:52:31 +0800 Subject: [PATCH 05/13] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=B7=A5=E5=8E=82=E5=A4=84=E7=90=86=E5=8E=9F=E7=94=9F?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 102 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 85 insertions(+), 17 deletions(-) diff --git a/src/common/logger.py b/src/common/logger.py index 4808fc77e..3bab08e6e 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -4,7 +4,15 @@ import sys from types import ModuleType from pathlib import Path -# logger.remove() +# 保存原生处理器ID +default_handler_id = None +for handler_id in logger._core.handlers: + default_handler_id = handler_id + break + +# 移除默认处理器 +if default_handler_id is not None: + logger.remove(default_handler_id) # 类型别名 LoguruLogger = logger.__class__ @@ -18,31 +26,54 @@ LOG_ROOT = "logs" # 默认全局配置 DEFAULT_CONFIG = { - # 日志级别配置 - "console_level": "DEBUG", # 控制台默认级别(可覆盖) - "file_level": "DEBUG", # 文件默认级别(可覆盖) + "console_level": "DEBUG", + "file_level": "DEBUG", # 格式配置 "console_format": ( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " - "{extra[module]: <4} | " + "{extra[module]: <12} | " "{message}" ), "file_format": ( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " - "{extra[module]: <20} | " + "{extra[module]: <15} | " "{message}" ), - "log_dir": LOG_ROOT, # 默认日志目录,需保留 - "rotation": "100 MB", # 设定轮转 - "retention": "7 days", # 设定时长 - "compression": "zip", # 设定压缩 + "log_dir": LOG_ROOT, + "rotation": "00:00", + "retention": "3 days", + "compression": "zip", } +def is_registered_module(record: dict) -> bool: + """检查是否为已注册的模块""" + return record["extra"].get("module") in _handler_registry + + +def is_unregistered_module(record: dict) -> bool: + """检查是否为未注册的模块""" + return not is_registered_module(record) + + +def log_patcher(record: dict) -> None: + """自动填充未设置模块名的日志记录,保留原生模块名称""" + if "module" not in record["extra"]: + # 尝试从name中提取模块名 + module_name = record.get("name", "") + if module_name == "": + module_name = "root" + record["extra"]["module"] = module_name + + +# 应用全局修补器 +logger.configure(patcher=log_patcher) + + class LogConfig: """日志配置类""" @@ -68,7 +99,7 @@ def get_module_logger( module_name = module if isinstance(module, str) else module.__name__ current_config = config.config if config else DEFAULT_CONFIG - # 若模块已注册,先移除旧处理器(避免重复添加) + # 清理旧处理器 if module_name in _handler_registry: for handler_id in _handler_registry[module_name]: logger.remove(handler_id) @@ -82,16 +113,15 @@ def get_module_logger( level=console_level or current_config["console_level"], format=current_config["console_format"], filter=lambda record: record["extra"].get("module") == module_name, - enqueue=current_config.get("enqueue", True), - backtrace=current_config.get("backtrace", False), - diagnose=current_config.get("diagnose", False), + enqueue=True, ) handler_ids.append(console_id) # 文件处理器 log_dir = Path(current_config["log_dir"]) log_dir.mkdir(parents=True, exist_ok=True) - log_file = log_dir / f"{module_name}_{{time:YYYY-MM-DD}}.log" + log_file = log_dir / module_name / f"{{time:YYYY-MM-DD}}.log" + log_file.parent.mkdir(parents=True, exist_ok=True) file_id = logger.add( sink=str(log_file), @@ -100,9 +130,9 @@ def get_module_logger( rotation=current_config["rotation"], retention=current_config["retention"], compression=current_config["compression"], - encoding=current_config.get("encoding", "utf-8"), + encoding="utf-8", filter=lambda record: record["extra"].get("module") == module_name, - enqueue=current_config.get("enqueue", True), + enqueue=True, ) handler_ids.append(file_id) @@ -124,3 +154,41 @@ def remove_module_logger(module_name: str) -> None: for handler_id in _handler_registry[module_name]: logger.remove(handler_id) del _handler_registry[module_name] + + +# 添加全局默认处理器(只处理未注册模块的日志--->控制台) +DEFAULT_GLOBAL_HANDLER = logger.add( + sink=sys.stderr, + level="DEBUG", + format=( + "{time:YYYY-MM-DD HH:mm:ss} | " + "{level: <8} | " + "{name: <12} | " + "{message}" + ), + filter=is_unregistered_module, # 只处理未注册模块的日志 + enqueue=True, +) + +# 添加全局默认文件处理器(只处理未注册模块的日志--->logs文件夹) +log_dir = Path(DEFAULT_CONFIG["log_dir"]) +log_dir.mkdir(parents=True, exist_ok=True) +other_log_dir = log_dir / "other" +other_log_dir.mkdir(parents=True, exist_ok=True) + +DEFAULT_FILE_HANDLER = logger.add( + sink=str(other_log_dir / f"{{time:YYYY-MM-DD}}.log"), + level="DEBUG", + format=( + "{time:YYYY-MM-DD HH:mm:ss} | " + "{level: <8} | " + "{name: <15} | " + "{message}" + ), + rotation=DEFAULT_CONFIG["rotation"], + retention=DEFAULT_CONFIG["retention"], + compression=DEFAULT_CONFIG["compression"], + encoding="utf-8", + filter=is_unregistered_module, # 只处理未注册模块的日志 + enqueue=True, +) From 7f64d70cd16a173bb5eb072a2adafeb71921ca86 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 14:53:47 +0800 Subject: [PATCH 06/13] =?UTF-8?q?fix:=20=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=BA=A7=E5=88=AB=E8=AE=BE=E5=AE=9A=E4=B8=BA?= =?UTF-8?q?INFO?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/logger.py b/src/common/logger.py index 3bab08e6e..19f365322 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -27,7 +27,7 @@ LOG_ROOT = "logs" # 默认全局配置 DEFAULT_CONFIG = { # 日志级别配置 - "console_level": "DEBUG", + "console_level": "INFO", "file_level": "DEBUG", # 格式配置 @@ -159,7 +159,7 @@ def remove_module_logger(module_name: str) -> None: # 添加全局默认处理器(只处理未注册模块的日志--->控制台) DEFAULT_GLOBAL_HANDLER = logger.add( sink=sys.stderr, - level="DEBUG", + level="INFO", format=( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " From 61fcc83049abf2dfda1fe6952acf50b54b81a529 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 15:00:25 +0800 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20=E6=8E=A7=E5=88=B6=E5=8F=B0?= =?UTF-8?q?=E5=8E=9F=E7=94=9F=E6=97=A5=E5=BF=97=EF=BC=88=E5=A6=82nonebot?= =?UTF-8?q?=EF=BC=89=E9=BB=98=E8=AE=A4=E7=BA=A7=E5=88=AB=E8=AE=BE=E5=AE=9A?= =?UTF-8?q?=E4=B8=BASUCCESS=E9=98=B2=E6=AD=A2=E5=96=B7=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/logger.py b/src/common/logger.py index 19f365322..201f3b1fb 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -159,7 +159,7 @@ def remove_module_logger(module_name: str) -> None: # 添加全局默认处理器(只处理未注册模块的日志--->控制台) DEFAULT_GLOBAL_HANDLER = logger.add( sink=sys.stderr, - level="INFO", + level="SUCCESS", format=( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " From ea88420ae258b2f3048db0cca46b4d1245de8752 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 15:10:58 +0800 Subject: [PATCH 08/13] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=89=80?= =?UTF-8?q?=E6=9C=89=E6=A8=A1=E5=9D=97=E5=AF=B9=E4=BA=8Elogger=E7=9A=84?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E5=BC=8F=EF=BC=88=E5=8F=AF?= =?UTF-8?q?=E8=83=BD=E4=B8=8D=E5=85=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bot.py | 2 +- src/gui/reasoning_gui.py | 7 +++++-- src/plugins/chat/__init__.py | 4 +++- src/plugins/chat/bot.py | 6 ++---- src/plugins/chat/chat_stream.py | 5 ++++- src/plugins/chat/config.py | 12 ++++-------- src/plugins/chat/emoji_manager.py | 7 ++----- src/plugins/chat/llm_generator.py | 4 +++- src/plugins/chat/message.py | 4 +++- src/plugins/chat/prompt_builder.py | 6 ++---- src/plugins/chat/relationship_manager.py | 4 +++- src/plugins/chat/storage.py | 4 +++- src/plugins/chat/topic_identifier.py | 4 +++- src/plugins/chat/utils.py | 4 +++- src/plugins/chat/utils_image.py | 5 ++++- src/plugins/memory_system/draw_memory.py | 4 +++- src/plugins/memory_system/memory.py | 10 ++-------- src/plugins/models/utils_model.py | 4 +++- src/plugins/moods/moods.py | 4 +++- src/plugins/remote/remote.py | 8 +++++--- src/plugins/schedule/schedule_generator.py | 4 +++- src/plugins/utils/statistic.py | 3 ++- src/plugins/willing/mode_dynamic.py | 4 +++- src/plugins/willing/willing_manager.py | 4 +++- 24 files changed, 72 insertions(+), 51 deletions(-) diff --git a/bot.py b/bot.py index 8201426c9..bf853bc0c 100644 --- a/bot.py +++ b/bot.py @@ -15,7 +15,7 @@ from src.common.logger import get_module_logger # 配置主程序日志格式 -logger = get_module_logger("主程序") +logger = get_module_logger("main_bot") # 获取没有加载env时的环境变量 env_mask = {key: os.getenv(key) for key in os.environ} diff --git a/src/gui/reasoning_gui.py b/src/gui/reasoning_gui.py index c577ba3ae..9ae58d38b 100644 --- a/src/gui/reasoning_gui.py +++ b/src/gui/reasoning_gui.py @@ -5,13 +5,14 @@ import threading import time from datetime import datetime from typing import Dict, List -from loguru import logger from typing import Optional - +from src.common.logger import get_module_logger import customtkinter as ctk from dotenv import load_dotenv +logger = get_module_logger("gui") + # 获取当前文件的目录 current_dir = os.path.dirname(os.path.abspath(__file__)) # 获取项目根目录 @@ -30,6 +31,8 @@ else: logger.error("未找到环境配置文件") sys.exit(1) +logger = get_module_logger("gui") + class ReasoningGUI: def __init__(self): # 记录启动时间戳,转换为Unix时间戳 diff --git a/src/plugins/chat/__init__.py b/src/plugins/chat/__init__.py index 6a30d3fba..75c7b4520 100644 --- a/src/plugins/chat/__init__.py +++ b/src/plugins/chat/__init__.py @@ -2,7 +2,6 @@ import asyncio import time import os -from loguru import logger from nonebot import get_driver, on_message, on_notice, require from nonebot.rule import to_me from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageSegment, MessageEvent, NoticeEvent @@ -21,6 +20,9 @@ from ..memory_system.memory import hippocampus, memory_graph from .bot import ChatBot from .message_sender import message_manager, message_sender from .storage import MessageStorage +from src.common.logger import get_module_logger + +logger = get_module_logger("chat_init") # 创建LLM统计实例 llm_stats = LLMStatistics("llm_statistics.txt") diff --git a/src/plugins/chat/bot.py b/src/plugins/chat/bot.py index 34c788d98..384031051 100644 --- a/src/plugins/chat/bot.py +++ b/src/plugins/chat/bot.py @@ -12,6 +12,7 @@ from nonebot.adapters.onebot.v11 import ( FriendRecallNoticeEvent, ) +from src.common.logger import get_module_logger from ..memory_system.memory import hippocampus from ..moods.moods import MoodManager # 导入情绪管理器 from .config import global_config @@ -31,11 +32,8 @@ from .utils_image import image_path_to_base64 from .utils_user import get_user_nickname, get_user_cardname, get_groupname from ..willing.willing_manager import willing_manager # 导入意愿管理器 from .message_base import UserInfo, GroupInfo, Seg -from ..utils.logger_config import LogClassification, LogModule -# 配置日志 -log_module = LogModule() -logger = log_module.setup_logger(LogClassification.CHAT) +logger = get_module_logger("chat_bot") class ChatBot: diff --git a/src/plugins/chat/chat_stream.py b/src/plugins/chat/chat_stream.py index 60b0af493..2670075c8 100644 --- a/src/plugins/chat/chat_stream.py +++ b/src/plugins/chat/chat_stream.py @@ -4,11 +4,14 @@ import time import copy from typing import Dict, Optional -from loguru import logger from ...common.database import db from .message_base import GroupInfo, UserInfo +from src.common.logger import get_module_logger + +logger = get_module_logger("chat_stream") + class ChatStream: """聊天流对象,存储一个完整的聊天上下文""" diff --git a/src/plugins/chat/config.py b/src/plugins/chat/config.py index db9dd17b5..d2d5d2165 100644 --- a/src/plugins/chat/config.py +++ b/src/plugins/chat/config.py @@ -4,11 +4,14 @@ from dataclasses import dataclass, field from typing import Dict, List, Optional import tomli -from loguru import logger from packaging import version from packaging.version import Version, InvalidVersion from packaging.specifiers import SpecifierSet, InvalidSpecifier +from src.common.logger import get_module_logger + +logger = get_module_logger("config") + @dataclass class BotConfig: @@ -440,10 +443,3 @@ else: global_config = BotConfig.load_config(config_path=bot_config_path) -if not global_config.enable_advance_output: - logger.remove() - -# 调试输出功能 -if global_config.enable_debug_output: - logger.remove() - logger.add(sys.stdout, level="DEBUG") diff --git a/src/plugins/chat/emoji_manager.py b/src/plugins/chat/emoji_manager.py index 183568f2f..1d0573ccb 100644 --- a/src/plugins/chat/emoji_manager.py +++ b/src/plugins/chat/emoji_manager.py @@ -9,7 +9,6 @@ from typing import Optional, Tuple from PIL import Image import io -from loguru import logger from nonebot import get_driver from ...common.database import db @@ -17,12 +16,10 @@ from ..chat.config import global_config from ..chat.utils import get_embedding from ..chat.utils_image import ImageManager, image_path_to_base64 from ..models.utils_model import LLM_request +from src.common.logger import get_module_logger -from ..utils.logger_config import LogClassification, LogModule +logger = get_module_logger("emoji") -# 配置日志 -log_module = LogModule() -logger = log_module.setup_logger(LogClassification.EMOJI) driver = get_driver() config = driver.config diff --git a/src/plugins/chat/llm_generator.py b/src/plugins/chat/llm_generator.py index a76f98dfb..5fb400b10 100644 --- a/src/plugins/chat/llm_generator.py +++ b/src/plugins/chat/llm_generator.py @@ -3,7 +3,6 @@ import time from typing import List, Optional, Tuple, Union from nonebot import get_driver -from loguru import logger from ...common.database import db from ..models.utils_model import LLM_request @@ -12,6 +11,9 @@ from .message import MessageRecv, MessageThinking, Message from .prompt_builder import prompt_builder from .relationship_manager import relationship_manager from .utils import process_llm_response +from src.common.logger import get_module_logger + +logger = get_module_logger("response_gen") driver = get_driver() config = driver.config diff --git a/src/plugins/chat/message.py b/src/plugins/chat/message.py index 633e74eea..6918401cf 100644 --- a/src/plugins/chat/message.py +++ b/src/plugins/chat/message.py @@ -6,12 +6,14 @@ from dataclasses import dataclass from typing import Dict, List, Optional import urllib3 -from loguru import logger from .utils_image import image_manager from .message_base import Seg, GroupInfo, UserInfo, BaseMessageInfo, MessageBase from .chat_stream import ChatStream, chat_manager +from src.common.logger import get_module_logger + +logger = get_module_logger("chat_message") # 禁用SSL警告 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) diff --git a/src/plugins/chat/prompt_builder.py b/src/plugins/chat/prompt_builder.py index 16d8882e4..2ab3aed92 100644 --- a/src/plugins/chat/prompt_builder.py +++ b/src/plugins/chat/prompt_builder.py @@ -9,11 +9,9 @@ from ..schedule.schedule_generator import bot_schedule from .config import global_config from .utils import get_embedding, get_recent_group_detailed_plain_text from .chat_stream import chat_manager +from src.common.logger import get_module_logger -from ..utils.logger_config import LogClassification, LogModule - -log_module = LogModule() -logger = log_module.setup_logger(LogClassification.PBUILDER) +logger = get_module_logger("prompt") logger.info("初始化Prompt系统") diff --git a/src/plugins/chat/relationship_manager.py b/src/plugins/chat/relationship_manager.py index d604e6734..937f5d7ce 100644 --- a/src/plugins/chat/relationship_manager.py +++ b/src/plugins/chat/relationship_manager.py @@ -1,11 +1,13 @@ import asyncio from typing import Optional -from loguru import logger +from src.common.logger import get_module_logger from ...common.database import db from .message_base import UserInfo from .chat_stream import ChatStream +logger = get_module_logger("rel_manager") + class Impression: traits: str = None called: str = None diff --git a/src/plugins/chat/storage.py b/src/plugins/chat/storage.py index 99ae13bd8..7f41daafb 100644 --- a/src/plugins/chat/storage.py +++ b/src/plugins/chat/storage.py @@ -3,7 +3,9 @@ from typing import Optional, Union from ...common.database import db from .message import MessageSending, MessageRecv from .chat_stream import ChatStream -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("message_storage") class MessageStorage: diff --git a/src/plugins/chat/topic_identifier.py b/src/plugins/chat/topic_identifier.py index a0c5bae30..58069f131 100644 --- a/src/plugins/chat/topic_identifier.py +++ b/src/plugins/chat/topic_identifier.py @@ -4,7 +4,9 @@ from nonebot import get_driver from ..models.utils_model import LLM_request from .config import global_config -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("topic_identifier") driver = get_driver() config = driver.config diff --git a/src/plugins/chat/utils.py b/src/plugins/chat/utils.py index 28e6b7f36..29f10fc20 100644 --- a/src/plugins/chat/utils.py +++ b/src/plugins/chat/utils.py @@ -7,7 +7,7 @@ from typing import Dict, List import jieba import numpy as np from nonebot import get_driver -from loguru import logger +from src.common.logger import get_module_logger from ..models.utils_model import LLM_request from ..utils.typo_generator import ChineseTypoGenerator @@ -21,6 +21,8 @@ from ...common.database import db driver = get_driver() config = driver.config +logger = get_module_logger("chat_utils") + def db_message_to_str(message_dict: Dict) -> str: diff --git a/src/plugins/chat/utils_image.py b/src/plugins/chat/utils_image.py index 6d900ba54..78b635df9 100644 --- a/src/plugins/chat/utils_image.py +++ b/src/plugins/chat/utils_image.py @@ -7,13 +7,16 @@ from typing import Optional, Union from PIL import Image import io -from loguru import logger from nonebot import get_driver from ...common.database import db from ..chat.config import global_config from ..models.utils_model import LLM_request +from src.common.logger import get_module_logger + +logger = get_module_logger("chat_image") + driver = get_driver() config = driver.config diff --git a/src/plugins/memory_system/draw_memory.py b/src/plugins/memory_system/draw_memory.py index df699f459..6fabc17d5 100644 --- a/src/plugins/memory_system/draw_memory.py +++ b/src/plugins/memory_system/draw_memory.py @@ -7,7 +7,9 @@ import jieba import matplotlib.pyplot as plt import networkx as nx from dotenv import load_dotenv -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("draw_memory") # 添加项目根目录到 Python 路径 root_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) diff --git a/src/plugins/memory_system/memory.py b/src/plugins/memory_system/memory.py index 47066ead5..aa8c7f940 100644 --- a/src/plugins/memory_system/memory.py +++ b/src/plugins/memory_system/memory.py @@ -3,7 +3,6 @@ import datetime import math import random import time -import os import jieba import networkx as nx @@ -18,14 +17,9 @@ from ..chat.utils import ( text_to_vector, ) from ..models.utils_model import LLM_request +from src.common.logger import get_module_logger -from ..utils.logger_config import LogClassification, LogModule - -# 配置日志 -log_module = LogModule() -logger = log_module.setup_logger(LogClassification.MEMORY) - -logger.info("初始化记忆系统") +logger = get_module_logger("memory_sys") class Memory_graph: diff --git a/src/plugins/models/utils_model.py b/src/plugins/models/utils_model.py index 893bece14..ee617a001 100644 --- a/src/plugins/models/utils_model.py +++ b/src/plugins/models/utils_model.py @@ -5,7 +5,7 @@ from datetime import datetime from typing import Tuple, Union import aiohttp -from loguru import logger +from src.common.logger import get_module_logger from nonebot import get_driver import base64 from PIL import Image @@ -16,6 +16,8 @@ from ..chat.config import global_config driver = get_driver() config = driver.config +logger = get_module_logger("model_utils") + class LLM_request: # 定义需要转换的模型列表,作为类变量避免重复 diff --git a/src/plugins/moods/moods.py b/src/plugins/moods/moods.py index c37bfc81d..0de889728 100644 --- a/src/plugins/moods/moods.py +++ b/src/plugins/moods/moods.py @@ -4,7 +4,9 @@ import time from dataclasses import dataclass from ..chat.config import global_config -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("mood_manager") @dataclass class MoodState: diff --git a/src/plugins/remote/remote.py b/src/plugins/remote/remote.py index 6020398e8..127806ebd 100644 --- a/src/plugins/remote/remote.py +++ b/src/plugins/remote/remote.py @@ -5,7 +5,9 @@ import platform import os import json import threading -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("remote") # UUID文件路径 UUID_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "client_uuid.json") @@ -30,9 +32,9 @@ def get_unique_id(): try: with open(UUID_FILE, "w") as f: json.dump({"client_id": client_id}, f) - print("已保存新生成的客户端ID到本地文件") + logger.info("已保存新生成的客户端ID到本地文件") except IOError as e: - print(f"保存UUID时出错: {e}") + logger.error(f"保存UUID时出错: {e}") return client_id diff --git a/src/plugins/schedule/schedule_generator.py b/src/plugins/schedule/schedule_generator.py index d117a32e6..a28e24999 100644 --- a/src/plugins/schedule/schedule_generator.py +++ b/src/plugins/schedule/schedule_generator.py @@ -3,13 +3,15 @@ import json import re from typing import Dict, Union -from loguru import logger from nonebot import get_driver from src.plugins.chat.config import global_config from ...common.database import db # 使用正确的导入语法 from ..models.utils_model import LLM_request +from src.common.logger import get_module_logger + +logger = get_module_logger("scheduler") driver = get_driver() config = driver.config diff --git a/src/plugins/utils/statistic.py b/src/plugins/utils/statistic.py index e812bce4b..f1f53275e 100644 --- a/src/plugins/utils/statistic.py +++ b/src/plugins/utils/statistic.py @@ -3,10 +3,11 @@ import time from collections import defaultdict from datetime import datetime, timedelta from typing import Any, Dict -from loguru import logger +from src.common.logger import get_module_logger from ...common.database import db +logger = get_module_logger("llm_statistics") class LLMStatistics: def __init__(self, output_file: str = "llm_statistics.txt"): diff --git a/src/plugins/willing/mode_dynamic.py b/src/plugins/willing/mode_dynamic.py index bab9a0d08..9f703fd85 100644 --- a/src/plugins/willing/mode_dynamic.py +++ b/src/plugins/willing/mode_dynamic.py @@ -2,7 +2,9 @@ import asyncio import random import time from typing import Dict -from loguru import logger +from src.common.logger import get_module_logger + +logger = get_module_logger("mode_dynamic") from ..chat.config import global_config diff --git a/src/plugins/willing/willing_manager.py b/src/plugins/willing/willing_manager.py index 1da3705ca..d9aa07143 100644 --- a/src/plugins/willing/willing_manager.py +++ b/src/plugins/willing/willing_manager.py @@ -1,11 +1,13 @@ from typing import Optional -from loguru import logger +from src.common.logger import get_module_logger from ..chat.config import global_config from .mode_classical import WillingManager as ClassicalWillingManager from .mode_dynamic import WillingManager as DynamicWillingManager from .mode_custom import WillingManager as CustomWillingManager +logger = get_module_logger("willing") + def init_willing_manager() -> Optional[object]: """ 根据配置初始化并返回对应的WillingManager实例 From 924e9994eda39ce41f2e7715247db2f90c74ef75 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 15:20:42 +0800 Subject: [PATCH 09/13] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=E6=BC=8F?= =?UTF-8?q?=E6=8E=89=E7=9A=84=E6=A8=A1=E5=9D=97=E5=AF=B9=E4=BA=8Elogger?= =?UTF-8?q?=E7=9A=84=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E5=BC=8F=EF=BC=88?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=B8=8D=E5=85=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/chat/cq_code.py | 3 ++- src/plugins/chat/message_sender.py | 3 ++- src/plugins/config_reload/__init__.py | 3 ++- src/plugins/memory_system/memory_manual_build.py | 4 +++- src/plugins/memory_system/memory_test1.py | 4 +++- src/plugins/memory_system/offline_llm.py | 3 ++- src/plugins/utils/typo_generator.py | 3 ++- webui.py | 3 ++- 8 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/plugins/chat/cq_code.py b/src/plugins/chat/cq_code.py index 8967698dd..5a20b0479 100644 --- a/src/plugins/chat/cq_code.py +++ b/src/plugins/chat/cq_code.py @@ -7,7 +7,7 @@ from typing import Dict, List, Optional, Union import ssl import os import aiohttp -from loguru import logger +from src.common.logger import get_module_logger from nonebot import get_driver from ..models.utils_model import LLM_request @@ -24,6 +24,7 @@ config = driver.config ssl_context = ssl.create_default_context() ssl_context.set_ciphers("AES128-GCM-SHA256") +logger = get_module_logger("cq_code") @dataclass class CQCode: diff --git a/src/plugins/chat/message_sender.py b/src/plugins/chat/message_sender.py index 2debbb522..b88861ac3 100644 --- a/src/plugins/chat/message_sender.py +++ b/src/plugins/chat/message_sender.py @@ -2,7 +2,7 @@ import asyncio import time from typing import Dict, List, Optional, Union -from loguru import logger +from src.common.logger import get_module_logger from nonebot.adapters.onebot.v11 import Bot from ...common.database import db from .message_cq import MessageSendCQ @@ -12,6 +12,7 @@ from .storage import MessageStorage from .config import global_config from .utils import truncate_message +logger = get_module_logger("msg_sender") class Message_Sender: """发送器""" diff --git a/src/plugins/config_reload/__init__.py b/src/plugins/config_reload/__init__.py index ddb7fa754..932191878 100644 --- a/src/plugins/config_reload/__init__.py +++ b/src/plugins/config_reload/__init__.py @@ -1,10 +1,11 @@ from nonebot import get_app from .api import router -from loguru import logger +from src.common.logger import get_module_logger # 获取主应用实例并挂载路由 app = get_app() app.include_router(router, prefix="/api") # 打印日志,方便确认API已注册 +logger = get_module_logger("cfg_reload") logger.success("配置重载API已注册,可通过 /api/reload-config 访问") \ No newline at end of file diff --git a/src/plugins/memory_system/memory_manual_build.py b/src/plugins/memory_system/memory_manual_build.py index 2d16998e0..18a5fd2db 100644 --- a/src/plugins/memory_system/memory_manual_build.py +++ b/src/plugins/memory_system/memory_manual_build.py @@ -11,7 +11,7 @@ from pathlib import Path import matplotlib.pyplot as plt import networkx as nx from dotenv import load_dotenv -from loguru import logger +from src.common.logger import get_module_logger import jieba # from chat.config import global_config @@ -29,6 +29,8 @@ project_root = current_dir.parent.parent.parent # env.dev文件路径 env_path = project_root / ".env.dev" +logger = get_module_logger("mem_build") + # 加载环境变量 if env_path.exists(): logger.info(f"从 {env_path} 加载环境变量") diff --git a/src/plugins/memory_system/memory_test1.py b/src/plugins/memory_system/memory_test1.py index 245eb9b26..3918e7b66 100644 --- a/src/plugins/memory_system/memory_test1.py +++ b/src/plugins/memory_system/memory_test1.py @@ -12,9 +12,11 @@ import matplotlib.pyplot as plt import networkx as nx import pymongo from dotenv import load_dotenv -from loguru import logger +from src.common.logger import get_module_logger import jieba +logger = get_module_logger("mem_test") + ''' 该理论认为,当两个或多个事物在形态上具有相似性时, 它们在记忆中会形成关联。 diff --git a/src/plugins/memory_system/offline_llm.py b/src/plugins/memory_system/offline_llm.py index 4a80b3ecd..ac89ddb25 100644 --- a/src/plugins/memory_system/offline_llm.py +++ b/src/plugins/memory_system/offline_llm.py @@ -5,8 +5,9 @@ from typing import Tuple, Union import aiohttp import requests -from loguru import logger +from src.common.logger import get_module_logger +logger = get_module_logger("offline_llm") class LLMModel: def __init__(self, model_name="deepseek-ai/DeepSeek-V3", **kwargs): diff --git a/src/plugins/utils/typo_generator.py b/src/plugins/utils/typo_generator.py index f99a7ab20..1cf09bdf3 100644 --- a/src/plugins/utils/typo_generator.py +++ b/src/plugins/utils/typo_generator.py @@ -13,8 +13,9 @@ from pathlib import Path import jieba from pypinyin import Style, pinyin -from loguru import logger +from src.common.logger import get_module_logger +logger = get_module_logger("typo_gen") class ChineseTypoGenerator: def __init__(self, diff --git a/webui.py b/webui.py index e22f250ea..8f36b4394 100644 --- a/webui.py +++ b/webui.py @@ -2,11 +2,12 @@ import gradio as gr import os import sys import toml -from loguru import logger +from src.common.logger import get_module_logger import shutil import ast import json +logger = get_module_logger("webui") is_share = False debug = True From c0f7d930b12e8439ff4143fb8fe0fe97c62dca2f Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 15:54:14 +0800 Subject: [PATCH 10/13] =?UTF-8?q?fix:=20memory=5Fmanual=5Fbuild.py=20?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=91=BD=E5=90=8D=E4=BF=AE=E6=94=B9=EF=BC=88?= =?UTF-8?q?CR=E6=84=8F=E8=A7=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/memory_system/memory_manual_build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/memory_system/memory_manual_build.py b/src/plugins/memory_system/memory_manual_build.py index 18a5fd2db..9b01640a9 100644 --- a/src/plugins/memory_system/memory_manual_build.py +++ b/src/plugins/memory_system/memory_manual_build.py @@ -29,7 +29,7 @@ project_root = current_dir.parent.parent.parent # env.dev文件路径 env_path = project_root / ".env.dev" -logger = get_module_logger("mem_build") +logger = get_module_logger("mem_manual_bd") # 加载环境变量 if env_path.exists(): From d77baf9ac8d9f415d14bf5478110c2181ab864e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=99=B4=E7=8C=AB?= Date: Sat, 15 Mar 2025 17:34:13 +0900 Subject: [PATCH 11/13] =?UTF-8?q?fix:=20=E9=87=8D=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96logger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/reasoning_gui.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/gui/reasoning_gui.py b/src/gui/reasoning_gui.py index 9ae58d38b..483e00759 100644 --- a/src/gui/reasoning_gui.py +++ b/src/gui/reasoning_gui.py @@ -31,8 +31,6 @@ else: logger.error("未找到环境配置文件") sys.exit(1) -logger = get_module_logger("gui") - class ReasoningGUI: def __init__(self): # 记录启动时间戳,转换为Unix时间戳 From 7c57e87378c64fbde3cabad19dd39ea394c89d70 Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 16:53:10 +0800 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20reasoning=5Fgui.py=20=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E5=88=9D=E5=A7=8B=E5=8C=96=EF=BC=88CR=E6=84=8F?= =?UTF-8?q?=E8=A7=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gui/reasoning_gui.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/gui/reasoning_gui.py b/src/gui/reasoning_gui.py index 9ae58d38b..b7a0fc086 100644 --- a/src/gui/reasoning_gui.py +++ b/src/gui/reasoning_gui.py @@ -31,7 +31,6 @@ else: logger.error("未找到环境配置文件") sys.exit(1) -logger = get_module_logger("gui") class ReasoningGUI: def __init__(self): From ce7c435e12fcf811c2d0146f2c9049407b70adbf Mon Sep 17 00:00:00 2001 From: AL76 <735756072@qq.com> Date: Sat, 15 Mar 2025 17:17:38 +0800 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20logger=E5=B7=A5=E5=8E=82=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=BA=A7=E5=88=AB=EF=BC=88CR=E6=84=8F?= =?UTF-8?q?=E8=A7=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/logger.py | 12 ++++++++---- template.env | 8 +++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/common/logger.py b/src/common/logger.py index 201f3b1fb..c546b700b 100644 --- a/src/common/logger.py +++ b/src/common/logger.py @@ -1,8 +1,12 @@ from loguru import logger from typing import Dict, Optional, Union, List import sys +import os from types import ModuleType from pathlib import Path +from dotenv import load_dotenv + +load_dotenv() # 保存原生处理器ID default_handler_id = None @@ -110,7 +114,7 @@ def get_module_logger( # 控制台处理器 console_id = logger.add( sink=sys.stderr, - level=console_level or current_config["console_level"], + level=os.getenv("CONSOLE_LOG_LEVEL", console_level or current_config["console_level"]), format=current_config["console_format"], filter=lambda record: record["extra"].get("module") == module_name, enqueue=True, @@ -125,7 +129,7 @@ def get_module_logger( file_id = logger.add( sink=str(log_file), - level=file_level or current_config["file_level"], + level=os.getenv("FILE_LOG_LEVEL", file_level or current_config["file_level"]), format=current_config["file_format"], rotation=current_config["rotation"], retention=current_config["retention"], @@ -159,7 +163,7 @@ def remove_module_logger(module_name: str) -> None: # 添加全局默认处理器(只处理未注册模块的日志--->控制台) DEFAULT_GLOBAL_HANDLER = logger.add( sink=sys.stderr, - level="SUCCESS", + level=os.getenv("DEFAULT_CONSOLE_LOG_LEVEL", "SUCCESS"), format=( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " @@ -178,7 +182,7 @@ other_log_dir.mkdir(parents=True, exist_ok=True) DEFAULT_FILE_HANDLER = logger.add( sink=str(other_log_dir / f"{{time:YYYY-MM-DD}}.log"), - level="DEBUG", + level=os.getenv("DEFAULT_FILE_LOG_LEVEL", "DEBUG"), format=( "{time:YYYY-MM-DD HH:mm:ss} | " "{level: <8} | " diff --git a/template.env b/template.env index 322776ce7..3d29025f4 100644 --- a/template.env +++ b/template.env @@ -23,7 +23,13 @@ CHAT_ANY_WHERE_BASE_URL=https://api.chatanywhere.tech/v1 SILICONFLOW_BASE_URL=https://api.siliconflow.cn/v1/ DEEP_SEEK_BASE_URL=https://api.deepseek.com/v1 -#定义你要用的api的key(需要去对应网站申请哦) +# 定义你要用的api的key(需要去对应网站申请哦) DEEP_SEEK_KEY= CHAT_ANY_WHERE_KEY= SILICONFLOW_KEY= + +# 定义日志相关配置 +CONSOLE_LOG_LEVEL=INFO # 自定义日志的默认控制台输出日志级别 +FILE_LOG_LEVEL=DEBUG # 自定义日志的默认文件输出日志级别 +DEFAULT_CONSOLE_LOG_LEVEL=SUCCESS # 原生日志的控制台输出日志级别(nonebot就是这一类) +DEFAULT_FILE_LOG_LEVEL=DEBUG # 原生日志的默认文件输出日志级别(nonebot就是这一类) \ No newline at end of file