Skip to content

Commit e37b094

Browse files
authored
Merge pull request #1813 from xinnan-tech/py_fix_log
Py fix log
2 parents 6b24844 + a491ce9 commit e37b094

File tree

4 files changed

+22
-79
lines changed

4 files changed

+22
-79
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,13 +144,18 @@
144144
</a>
145145
</td>
146146
<td>
147-
<a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank">
147+
<a href="https://www.bilibili.com/video/BV1ZQKUzYExM" target="_blank">
148148
<picture>
149149
<img alt="MCP接入点" src="docs/images/demo13.png" />
150150
</picture>
151151
</a>
152152
</td>
153153
<td>
154+
<a href="https://www.bilibili.com/video/BV1Exu3zqEDe" target="_blank">
155+
<picture>
156+
<img alt="声纹识别" src="docs/images/demo14.png" />
157+
</picture>
158+
</a>
154159
</td>
155160
</tr>
156161
</table>

docs/images/demo14.png

176 KB
Loading

main/xiaozhi-server/config/logger.py

Lines changed: 11 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,12 @@ def build_module_string(selected_module):
3535

3636

3737
def formatter(record):
38-
"""为没有 tag 的日志添加默认值"""
38+
"""为没有 tag 的日志添加默认值,并处理动态模块字符串"""
3939
record["extra"].setdefault("tag", record["name"])
40+
# 如果没有设置 selected_module,使用默认值
41+
record["extra"].setdefault("selected_module", "00000000000000")
42+
# 将 selected_module 从 extra 提取到顶级,以支持 {selected_module} 格式
43+
record["selected_module"] = record["extra"]["selected_module"]
4044
return record["message"]
4145

4246

@@ -49,11 +53,11 @@ def setup_logging():
4953

5054
# 第一次初始化时配置日志
5155
if not _logger_initialized:
56+
# 使用默认的模块字符串进行初始化
5257
logger.configure(
5358
extra={
54-
"selected_module": log_config.get("selected_module", "00000000000000")
55-
}
56-
) # 新增配置
59+
"selected_module": "00000000000000"})
60+
5761
log_format = log_config.get(
5862
"log_format",
5963
"<green>{time:YYMMDD HH:mm:ss}</green>[{version}_{extra[selected_module]}][<light-blue>{extra[tag]}</light-blue>]-<level>{level}</level>-<light-green>{message}</light-green>",
@@ -62,14 +66,8 @@ def setup_logging():
6266
"log_format_file",
6367
"{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}",
6468
)
65-
selected_module_str = logger._core.extra["selected_module"]
66-
6769
log_format = log_format.replace("{version}", SERVER_VERSION)
68-
log_format = log_format.replace("{selected_module}", selected_module_str)
6970
log_format_file = log_format_file.replace("{version}", SERVER_VERSION)
70-
log_format_file = log_format_file.replace(
71-
"{selected_module}", selected_module_str
72-
)
7371

7472
log_level = log_config.get("log_level", "INFO")
7573
log_dir = log_config.get("log_dir", "tmp")
@@ -108,66 +106,7 @@ def setup_logging():
108106
return logger
109107

110108

111-
def update_module_string(selected_module_str):
112-
"""更新模块字符串并重新配置日志处理器"""
113-
logger.debug(f"更新日志配置组件")
114-
current_module = logger._core.extra["selected_module"]
115-
116-
if current_module == selected_module_str:
117-
logger.debug(f"组件未更改无需更新")
118-
return
119-
120-
try:
121-
logger.configure(extra={"selected_module": selected_module_str})
122-
123-
config = load_config()
124-
log_config = config["log"]
125-
126-
log_format = log_config.get(
127-
"log_format",
128-
"<green>{time:YYMMDD HH:mm:ss}</green>[{version}_{extra[selected_module]}][<light-blue>{extra[tag]}</light-blue>]-<level>{level}</level>-<light-green>{message}</light-green>",
129-
)
130-
log_format_file = log_config.get(
131-
"log_format_file",
132-
"{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}",
133-
)
134-
135-
log_format = log_format.replace("{version}", SERVER_VERSION)
136-
log_format = log_format.replace("{selected_module}", selected_module_str)
137-
log_format_file = log_format_file.replace("{version}", SERVER_VERSION)
138-
log_format_file = log_format_file.replace(
139-
"{selected_module}", selected_module_str
140-
)
141-
142-
logger.remove()
143-
logger.add(
144-
sys.stdout,
145-
format=log_format,
146-
level=log_config.get("log_level", "INFO"),
147-
filter=formatter,
148-
)
149-
150-
# 更新文件日志配置 - 统一目录,按大小轮转
151-
log_dir = log_config.get("log_dir", "tmp")
152-
log_file = log_config.get("log_file", "server.log")
153-
154-
# 日志文件完整路径
155-
log_file_path = os.path.join(log_dir, log_file)
156-
157-
logger.add(
158-
log_file_path,
159-
format=log_format_file,
160-
level=log_config.get("log_level", "INFO"),
161-
filter=formatter,
162-
rotation="10 MB", # 每个文件最大10MB
163-
retention="30 days", # 保留30天
164-
compression=None,
165-
encoding="utf-8",
166-
enqueue=True, # 异步安全
167-
backtrace=True,
168-
diagnose=True,
169-
)
109+
def create_connection_logger(selected_module_str):
110+
"""为连接创建独立的日志器,绑定特定的模块字符串"""
111+
return logger.bind(selected_module=selected_module_str)
170112

171-
except Exception as e:
172-
logger.error(f"日志配置更新失败: {str(e)}")
173-
raise

main/xiaozhi-server/core/connection.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from core.auth import AuthMiddleware, AuthenticationError
3737
from config.config_loader import get_private_config_from_api
3838
from core.providers.tts.dto.dto import ContentType, TTSMessageDTO, SentenceType
39-
from config.logger import setup_logging, build_module_string, update_module_string
39+
from config.logger import setup_logging, build_module_string, create_connection_logger
4040
from config.manage_api_client import DeviceNotFoundException, DeviceBindException
4141
from core.utils.prompt_manager import PromptManager
4242

@@ -331,9 +331,9 @@ def _initialize_components(self):
331331
self.selected_module_str = build_module_string(
332332
self.config.get("selected_module", {})
333333
)
334-
update_module_string(self.selected_module_str)
335-
336-
"""快速初始化系统提示词"""
334+
self.logger = create_connection_logger(self.selected_module_str)
335+
336+
"""初始化组件"""
337337
if self.config.get("prompt") is not None:
338338
user_prompt = self.config["prompt"]
339339
# 使用快速提示词进行初始化
@@ -864,14 +864,13 @@ def _report_worker(self):
864864
item = self.report_queue.get(timeout=1)
865865
if item is None: # 检测毒丸对象
866866
break
867-
type, text, audio_data, report_time = item
868867
try:
869868
# 检查线程池状态
870869
if self.executor is None:
871870
continue
872871
# 提交任务到线程池
873872
self.executor.submit(
874-
self._process_report, type, text, audio_data, report_time
873+
self._process_report, *item
875874
)
876875
except Exception as e:
877876
self.logger.bind(tag=TAG).error(f"聊天记录上报线程异常: {e}")

0 commit comments

Comments
 (0)