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 = {}