diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index 5bbda5a1..e5fec630 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.5.1" +_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 3243f18b..11ae6836 100644 --- a/main/xiaozhi-server/core/connection.py +++ b/main/xiaozhi-server/core/connection.py @@ -19,7 +19,6 @@ from core.utils.util import ( initialize_tts, ) from typing import Dict, Any -from config.logger import setup_logging from core.mcp.manager import MCPManager from core.handle.reportHandle import report from core.providers.tts.default import DefaultTTS @@ -33,6 +32,7 @@ from core.auth import AuthMiddleware, AuthenticationError from config.config_loader import get_private_config_from_api from core.handle.receiveAudioHandle import handleAudioMessage from core.providers.tts.dto.dto import ContentType, TTSMessageDTO, SentenceType +from config.logger import setup_logging, build_module_string, update_module_string from config.manage_api_client import DeviceNotFoundException, DeviceBindException @@ -299,7 +299,10 @@ class ConnectionHandler: def _initialize_components(self): try: - + 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"]