Files
xiaozhi-esp32-server/main/xiaozhi-server/config/logger.py
T

115 lines
4.0 KiB
Python
Raw Normal View History

2025-02-02 23:01:14 +08:00
import os
2025-02-18 00:07:19 +08:00
import sys
from loguru import logger
2025-04-12 17:36:04 +08:00
from config.config_loader import load_config
2025-04-30 15:05:42 +08:00
from config.settings import check_config_file
from datetime import datetime
2025-02-23 15:18:59 +08:00
2025-07-11 09:14:34 +08:00
SERVER_VERSION = "0.7.1"
2025-05-27 16:17:13 +08:00
_logger_initialized = False
2025-06-04 15:42:52 +08:00
2025-03-26 10:15:00 +08:00
2025-04-12 17:36:04 +08:00
def get_module_abbreviation(module_name, module_dict):
2025-06-04 15:42:52 +08:00
"""获取模块名称的缩写,如果为空则返回00
如果名称中包含下划线,则返回下划线后面的前两个字符
"""
module_value = module_dict.get(module_name, "")
if not module_value:
return "00"
if "_" in module_value:
parts = module_value.split("_")
return parts[-1][:2] if parts[-1] else "00"
return module_value[:2]
2025-04-12 17:36:04 +08:00
2025-06-04 15:42:52 +08:00
2025-04-12 17:36:04 +08:00
def build_module_string(selected_module):
"""构建模块字符串"""
return (
get_module_abbreviation("VAD", selected_module)
+ get_module_abbreviation("ASR", selected_module)
+ get_module_abbreviation("LLM", selected_module)
+ get_module_abbreviation("TTS", selected_module)
+ get_module_abbreviation("Memory", selected_module)
+ get_module_abbreviation("Intent", selected_module)
2025-07-14 07:28:05 +08:00
+ get_module_abbreviation("VLLM", selected_module)
2025-04-12 17:36:04 +08:00
)
2025-06-04 15:42:52 +08:00
def formatter(record):
2025-07-11 16:44:50 +08:00
"""为没有 tag 的日志添加默认值,并处理动态模块字符串"""
record["extra"].setdefault("tag", record["name"])
2025-07-11 16:44:50 +08:00
# 如果没有设置 selected_module,使用默认值
record["extra"].setdefault("selected_module", "00000000000000")
# 将 selected_module 从 extra 提取到顶级,以支持 {selected_module} 格式
record["selected_module"] = record["extra"]["selected_module"]
return record["message"]
2025-02-23 15:18:59 +08:00
def setup_logging():
2025-04-30 15:05:42 +08:00
check_config_file()
2025-02-23 15:18:59 +08:00
"""从配置文件中读取日志配置,并设置日志输出格式和级别"""
config = load_config()
log_config = config["log"]
2025-05-27 16:17:13 +08:00
global _logger_initialized
2025-03-26 10:15:00 +08:00
2025-05-27 16:17:13 +08:00
# 第一次初始化时配置日志
if not _logger_initialized:
2025-07-11 16:44:50 +08:00
# 使用默认的模块字符串进行初始化
2025-05-30 09:32:11 +08:00
logger.configure(
extra={
2025-07-14 07:28:05 +08:00
"selected_module": log_config.get("selected_module", "00000000000000"),
})
2025-07-11 16:44:50 +08:00
2025-05-27 16:17:13 +08:00
log_format = log_config.get(
"log_format",
"<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>",
)
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}",
2025-05-27 16:17:13 +08:00
)
log_format = log_format.replace("{version}", SERVER_VERSION)
log_format_file = log_format_file.replace("{version}", SERVER_VERSION)
2025-02-02 23:01:14 +08:00
2025-05-27 16:17:13 +08:00
log_level = log_config.get("log_level", "INFO")
log_dir = log_config.get("log_dir", "tmp")
2025-06-04 15:42:52 +08:00
log_file = log_config.get("log_file", "server.log")
2025-05-27 16:17:13 +08:00
data_dir = log_config.get("data_dir", "data")
2025-02-02 23:01:14 +08:00
2025-05-27 16:17:13 +08:00
os.makedirs(log_dir, exist_ok=True)
os.makedirs(data_dir, exist_ok=True)
2025-02-18 00:07:19 +08:00
2025-05-27 16:17:13 +08:00
# 配置日志输出
logger.remove()
2025-02-18 00:07:19 +08:00
2025-05-27 16:17:13 +08:00
# 输出到控制台
logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter)
# 输出到文件 - 统一目录,按大小轮转
# 日志文件完整路径
log_file_path = os.path.join(log_dir, log_file)
2025-06-26 16:34:30 +08:00
# 添加日志处理器
2025-05-27 16:17:13 +08:00
logger.add(
log_file_path,
2025-05-27 16:17:13 +08:00
format=log_format_file,
level=log_level,
filter=formatter,
rotation="10 MB", # 每个文件最大10MB
retention="30 days", # 保留30天
compression=None,
encoding="utf-8",
enqueue=True, # 异步安全
backtrace=True,
diagnose=True,
2025-05-27 16:17:13 +08:00
)
2025-06-04 15:42:52 +08:00
_logger_initialized = True # 标记为已初始化
2025-02-18 00:07:19 +08:00
return logger
2025-05-27 16:17:13 +08:00
2025-06-04 15:42:52 +08:00
2025-07-11 16:44:50 +08:00
def create_connection_logger(selected_module_str):
"""为连接创建独立的日志器,绑定特定的模块字符串"""
return logger.bind(selected_module=selected_module_str)
2025-05-27 16:17:13 +08:00