From 47e4c0f190c0806bb0c8874294d13ea9ac2a90ac Mon Sep 17 00:00:00 2001
From: 3030332422 <3030332422@qq.com>
Date: Fri, 11 Jul 2025 16:44:50 +0800
Subject: [PATCH] =?UTF-8?q?fix:=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6?=
=?UTF-8?q?=E7=9A=84=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/config/logger.py | 83 ++++----------------------
main/xiaozhi-server/core/connection.py | 9 +--
2 files changed, 16 insertions(+), 76 deletions(-)
diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py
index b89b5813..612047b1 100644
--- a/main/xiaozhi-server/config/logger.py
+++ b/main/xiaozhi-server/config/logger.py
@@ -35,8 +35,12 @@ def build_module_string(selected_module):
def formatter(record):
- """为没有 tag 的日志添加默认值"""
+ """为没有 tag 的日志添加默认值,并处理动态模块字符串"""
record["extra"].setdefault("tag", record["name"])
+ # 如果没有设置 selected_module,使用默认值
+ record["extra"].setdefault("selected_module", "00000000000000")
+ # 将 selected_module 从 extra 提取到顶级,以支持 {selected_module} 格式
+ record["selected_module"] = record["extra"]["selected_module"]
return record["message"]
@@ -49,11 +53,11 @@ def setup_logging():
# 第一次初始化时配置日志
if not _logger_initialized:
+ # 使用默认的模块字符串进行初始化
logger.configure(
extra={
- "selected_module": log_config.get("selected_module", "00000000000000")
- }
- ) # 新增配置
+ "selected_module": "00000000000000"})
+
log_format = log_config.get(
"log_format",
"{time:YYMMDD HH:mm:ss}[{version}_{extra[selected_module]}][{extra[tag]}]-{level}-{message}",
@@ -62,14 +66,8 @@ def setup_logging():
"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_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
- )
log_level = log_config.get("log_level", "INFO")
log_dir = log_config.get("log_dir", "tmp")
@@ -108,66 +106,7 @@ def setup_logging():
return logger
-def update_module_string(selected_module_str):
- """更新模块字符串并重新配置日志处理器"""
- logger.debug(f"更新日志配置组件")
- current_module = logger._core.extra["selected_module"]
+def create_connection_logger(selected_module_str):
+ """为连接创建独立的日志器,绑定特定的模块字符串"""
+ return logger.bind(selected_module=selected_module_str)
- if current_module == selected_module_str:
- logger.debug(f"组件未更改无需更新")
- 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,
- )
-
- # 更新文件日志配置 - 统一目录,按大小轮转
- log_dir = log_config.get("log_dir", "tmp")
- log_file = log_config.get("log_file", "server.log")
-
- # 日志文件完整路径
- log_file_path = os.path.join(log_dir, log_file)
-
- logger.add(
- log_file_path,
- format=log_format_file,
- level=log_config.get("log_level", "INFO"),
- filter=formatter,
- rotation="10 MB", # 每个文件最大10MB
- retention="30 days", # 保留30天
- compression=None,
- encoding="utf-8",
- enqueue=True, # 异步安全
- backtrace=True,
- diagnose=True,
- )
-
- 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 7b45ad2d..f9b57295 100644
--- a/main/xiaozhi-server/core/connection.py
+++ b/main/xiaozhi-server/core/connection.py
@@ -35,7 +35,7 @@ from plugins_func.register import Action, ActionResponse
from core.auth import AuthMiddleware, AuthenticationError
from config.config_loader import get_private_config_from_api
from core.providers.tts.dto.dto import ContentType, TTSMessageDTO, SentenceType
-from config.logger import setup_logging, build_module_string, update_module_string
+from config.logger import setup_logging, build_module_string, create_connection_logger
from config.manage_api_client import DeviceNotFoundException, DeviceBindException
@@ -327,7 +327,9 @@ class ConnectionHandler:
self.selected_module_str = build_module_string(
self.config.get("selected_module", {})
)
- update_module_string(self.selected_module_str)
+ # 创建日志器
+ self.logger = create_connection_logger(self.selected_module_str)
+
"""初始化组件"""
if self.config.get("prompt") is not None:
self.prompt = self.config["prompt"]
@@ -824,14 +826,13 @@ class ConnectionHandler:
item = self.report_queue.get(timeout=1)
if item is None: # 检测毒丸对象
break
- type, text, audio_data, report_time = item
try:
# 检查线程池状态
if self.executor is None:
continue
# 提交任务到线程池
self.executor.submit(
- self._process_report, type, text, audio_data, report_time
+ self._process_report, *item
)
except Exception as e:
self.logger.bind(tag=TAG).error(f"聊天记录上报线程异常: {e}")