From 17585c8294cb351258633f1b7fb4fd64e90dda14 Mon Sep 17 00:00:00 2001 From: Sakura-RanChen <1908198662@qq.com> Date: Tue, 27 May 2025 16:17:13 +0800 Subject: [PATCH 1/2] =?UTF-8?q?update:=E6=97=A5=E5=BF=97=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config/logger.py | 109 ++++++++++++++++++------- main/xiaozhi-server/core/connection.py | 8 +- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index 5588e00f..44b3aab4 100644 --- a/main/xiaozhi-server/config/logger.py +++ b/main/xiaozhi-server/config/logger.py @@ -5,6 +5,7 @@ from config.config_loader import load_config from config.settings import check_config_file SERVER_VERSION = "0.4.4" +_logger_initialized = False def get_module_abbreviation(module_name, module_dict): @@ -43,41 +44,89 @@ def setup_logging(): """从配置文件中读取日志配置,并设置日志输出格式和级别""" config = load_config() log_config = config["log"] - log_format = log_config.get( - "log_format", - "{time:YYMMDD HH:mm:ss}[{version}_{selected_module}][{extra[tag]}]-{level}-{message}", - ) - log_format_file = log_config.get( - "log_format_file", - "{time:YYYY-MM-DD HH:mm:ss} - {version_{selected_module}} - {name} - {level} - {extra[tag]} - {message}", - ) - selected_module_str = build_module_string(config.get("selected_module", {})) + global _logger_initialized - log_format = log_format.replace("{version}", SERVER_VERSION) - log_format = log_format.replace("{selected_module}", selected_module_str) - log_format_file = log_format_file.replace("{version}", SERVER_VERSION) - log_format_file = log_format_file.replace("{selected_module}", selected_module_str) + # 第一次初始化时配置日志 + if not _logger_initialized: + logger.configure(extra={"selected_module": log_config.get("selected_module", "00000000000000")}) # 新增配置 + log_format = log_config.get( + "log_format", + "{time:YYMMDD HH:mm:ss}[{version}_{extra[selected_module]}][{extra[tag]}]-{level}-{message}", + ) + log_format_file = log_config.get( + "log_format_file", + "{time:YYYY-MM-DD HH:mm:ss} - {version_{extra[selected_module]}} - {name} - {level} - {extra[tag]} - {message}", + ) + selected_module_str = logger._core.extra["selected_module"] - log_level = log_config.get("log_level", "INFO") - log_dir = log_config.get("log_dir", "tmp") - log_file = log_config.get("log_file", "server.log") - data_dir = log_config.get("data_dir", "data") + log_format = log_format.replace("{version}", SERVER_VERSION) + log_format = log_format.replace("{selected_module}", selected_module_str) + log_format_file = log_format_file.replace("{version}", SERVER_VERSION) + log_format_file = log_format_file.replace("{selected_module}", selected_module_str) - os.makedirs(log_dir, exist_ok=True) - os.makedirs(data_dir, exist_ok=True) + log_level = log_config.get("log_level", "INFO") + log_dir = log_config.get("log_dir", "tmp") + log_file = log_config.get("log_file", "server.log") + data_dir = log_config.get("data_dir", "data") - # 配置日志输出 - logger.remove() + os.makedirs(log_dir, exist_ok=True) + os.makedirs(data_dir, exist_ok=True) - # 输出到控制台 - logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter) + # 配置日志输出 + logger.remove() - # 输出到文件 - logger.add( - os.path.join(log_dir, log_file), - format=log_format_file, - level=log_level, - filter=formatter, - ) + # 输出到控制台 + logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter) + + # 输出到文件 + logger.add( + os.path.join(log_dir, log_file), + format=log_format_file, + level=log_level, + filter=formatter, + ) + _logger_initialized = True # 标记为已初始化 return logger + + +def update_module_string(selected_module_str): + """更新模块字符串并重新配置日志处理器""" + logger.debug(f"更新日志配置组件") + current_module = logger._core.extra["selected_module"] + + if current_module == selected_module_str: + return + + try: + logger.configure(extra={"selected_module": selected_module_str}) + + config = load_config() + log_config = config["log"] + + log_format = log_config.get( + "log_format", + "{time:YYMMDD HH:mm:ss}[{version}_{extra[selected_module]}][{extra[tag]}]-{level}-{message}", + ) + log_format_file = log_config.get( + "log_format_file", + "{time:YYYY-MM-DD HH:mm:ss} - {version_{extra[selected_module]}} - {name} - {level} - {extra[tag]} - {message}", + ) + + log_format = log_format.replace("{version}", SERVER_VERSION) + log_format = log_format.replace("{selected_module}", selected_module_str) + log_format_file = log_format_file.replace("{version}", SERVER_VERSION) + log_format_file = log_format_file.replace("{selected_module}", selected_module_str) + + logger.remove() + logger.add(sys.stdout, format=log_format, level=log_config.get("log_level", "INFO"), filter=formatter) + logger.add( + os.path.join(log_config.get("log_dir", "tmp"), log_config.get("log_file", "server.log")), + format=log_format_file, + level=log_config.get("log_level", "INFO"), + filter=formatter + ) + + except Exception as e: + logger.error(f"日志配置更新失败: {str(e)}") + raise diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index ea0be02d..5d6b0328 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -13,7 +13,7 @@ import threading import websockets from typing import Dict, Any from plugins_func.loadplugins import auto_import_modules -from config.logger import setup_logging +from config.logger import setup_logging, build_module_string, update_module_string from config.config_loader import get_project_dir from core.utils import p3 from core.utils.dialogue import Message, Dialogue @@ -351,6 +351,8 @@ class ConnectionHandler: def _initialize_private_config(self): """如果是从配置文件获取,则进行二次实例化""" if not self.read_config_from_api: + self.selected_module_str = build_module_string(self.config.get("selected_module", {})) + update_module_string(self.selected_module_str) return """从接口获取差异化的配置进行二次实例化,非全量重新实例化""" try: @@ -429,6 +431,10 @@ class ConnectionHandler: init_memory, init_intent, ) + # 在初始化组件后更新模块字符串 + self.selected_module_str = build_module_string(self.config.get("selected_module", {})) + # 更新日志模块配置 + update_module_string(self.selected_module_str) except Exception as e: self.logger.bind(tag=TAG).error(f"初始化组件失败: {e}") modules = {} From 22054cf8bc29cd48d2f794261f1bc2f4622f2019 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Wed, 28 May 2025 01:00:48 +0800 Subject: [PATCH 2/2] =?UTF-8?q?update:=E6=9B=B4=E6=96=B0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E6=A0=87=E8=AF=86=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/connection.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/main/xiaozhi-server/core/connection.py b/main/xiaozhi-server/core/connection.py index 5d6b0328..3666e264 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -315,6 +315,10 @@ class ConnectionHandler: ) def _initialize_components(self): + self.selected_module_str = build_module_string( + self.config.get("selected_module", {}) + ) + update_module_string(self.selected_module_str) """初始化组件""" if self.config.get("prompt") is not None: self.prompt = self.config["prompt"] @@ -351,8 +355,6 @@ class ConnectionHandler: def _initialize_private_config(self): """如果是从配置文件获取,则进行二次实例化""" if not self.read_config_from_api: - self.selected_module_str = build_module_string(self.config.get("selected_module", {})) - update_module_string(self.selected_module_str) return """从接口获取差异化的配置进行二次实例化,非全量重新实例化""" try: @@ -431,10 +433,6 @@ class ConnectionHandler: init_memory, init_intent, ) - # 在初始化组件后更新模块字符串 - self.selected_module_str = build_module_string(self.config.get("selected_module", {})) - # 更新日志模块配置 - update_module_string(self.selected_module_str) except Exception as e: self.logger.bind(tag=TAG).error(f"初始化组件失败: {e}") modules = {}