From 0268f90e9c69ae0ac9556cdcbebf59946ce76938 Mon Sep 17 00:00:00 2001
From: CGD <3030332422@qq.com>
Date: Wed, 4 Jun 2025 14:46:52 +0800
Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=E4=BF=AE=E6=94=B9=E6=97=A5?=
=?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=EF=BC=8C=E4=BD=BF=E5=85=B6=E6=8C=89?=
=?UTF-8?q?=E6=97=A5=E6=9C=9F=E5=92=8C=E5=A4=A7=E5=B0=8F=E5=88=86=E5=89=B2?=
=?UTF-8?q?=E7=9A=84=E6=97=A5=E5=BF=97=E6=96=87=E4=BB=B6=E5=90=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
main/xiaozhi-server/config/logger.py | 91 +++++++++++++++++++++++-----
1 file changed, 75 insertions(+), 16 deletions(-)
diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py
index 5f107f5d..e5bf8466 100644
--- a/main/xiaozhi-server/config/logger.py
+++ b/main/xiaozhi-server/config/logger.py
@@ -3,15 +3,16 @@ import sys
from loguru import logger
from config.config_loader import load_config
from config.settings import check_config_file
+from datetime import datetime
SERVER_VERSION = "0.5.2"
_logger_initialized = False
-
+_current_log_file = None
+_current_log_size = 0
+_max_log_size = 10 * 1024 * 1024 # 10MB
def get_module_abbreviation(module_name, module_dict):
- """获取模块名称的缩写,如果为空则返回00
- 如果名称中包含下划线,则返回下划线后面的前两个字符
- """
+ """获取模块名称的缩写,如果为空则返回00"""
module_value = module_dict.get(module_name, "")
if not module_value:
return "00"
@@ -20,7 +21,6 @@ def get_module_abbreviation(module_name, module_dict):
return parts[-1][:2] if parts[-1] else "00"
return module_value[:2]
-
def build_module_string(selected_module):
"""构建模块字符串"""
return (
@@ -32,12 +32,59 @@ def build_module_string(selected_module):
+ get_module_abbreviation("Intent", selected_module)
)
-
def formatter(record):
"""为没有 tag 的日志添加默认值"""
record["extra"].setdefault("tag", record["name"])
return record["message"]
+def get_log_filename(log_dir, base_name):
+ """生成按日期和大小分割的日志文件名"""
+ global _current_log_file, _current_log_size
+
+ now = datetime.now()
+ date_part = f"{now.month}.{now.day}"
+
+ # 检查是否需要创建新文件
+ if _current_log_file is None or not os.path.exists(_current_log_file):
+ file_index = 1
+ while True:
+ new_filename = os.path.join(log_dir, f"{base_name}.{date_part}.{file_index}")
+ if not os.path.exists(new_filename):
+ _current_log_file = new_filename
+ _current_log_size = 0
+ return new_filename
+ # 如果文件已存在,增加索引
+ file_index += 1
+ else:
+ # 检查文件大小
+ if _current_log_size > _max_log_size:
+ # 文件过大,创建新文件
+ base_path = os.path.splitext(_current_log_file)[0]
+ parts = base_path.split('.')
+ if len(parts) >= 3:
+ try:
+ file_index = int(parts[-1]) + 1
+ except ValueError:
+ file_index = 1
+ else:
+ file_index = 1
+
+ new_filename = f"{base_path.rsplit('.', 1)[0]}.{file_index}"
+ _current_log_file = new_filename
+ _current_log_size = 0
+ return new_filename
+ else:
+ return _current_log_file
+
+def update_log_size(message):
+ """更新当前日志文件大小"""
+ global _current_log_size
+ # 如果当前日志文件存在,获取其大小
+ if _current_log_file and os.path.exists(_current_log_file):
+ _current_log_size = os.path.getsize(_current_log_file)
+ else:
+ # 如果当前日志文件不存在,重置大小
+ _current_log_size = len(message.encode('utf-8'))
def setup_logging():
check_config_file()
@@ -52,7 +99,7 @@ def setup_logging():
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}",
@@ -72,7 +119,7 @@ def setup_logging():
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")
+ log_file = log_config.get("log_file", "server")
data_dir = log_config.get("data_dir", "data")
os.makedirs(log_dir, exist_ok=True)
@@ -84,18 +131,23 @@ def setup_logging():
# 输出到控制台
logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter)
- # 输出到文件
+ # 输出到文件,使用自定义的日志文件名生成器
+ def sink(message):
+ filename = get_log_filename(log_dir, log_file)
+ with open(filename, "a", encoding="utf-8") as f:
+ f.write(message + "\n")
+ update_log_size(message)
+
logger.add(
- os.path.join(log_dir, log_file),
+ sink,
format=log_format_file,
level=log_level,
filter=formatter,
)
- _logger_initialized = True # 标记为已初始化
+ _logger_initialized = True
return logger
-
def update_module_string(selected_module_str):
"""更新模块字符串并重新配置日志处理器"""
logger.debug(f"更新日志配置组件")
@@ -126,6 +178,9 @@ def update_module_string(selected_module_str):
"{selected_module}", selected_module_str
)
+ log_dir = log_config.get("log_dir", "tmp")
+ log_file = log_config.get("log_file", "server")
+
logger.remove()
logger.add(
sys.stdout,
@@ -133,11 +188,15 @@ def update_module_string(selected_module_str):
level=log_config.get("log_level", "INFO"),
filter=formatter,
)
+
+ def sink(message):
+ filename = get_log_filename(log_dir, log_file)
+ with open(filename, "a", encoding="utf-8") as f:
+ f.write(message + "\n")
+ update_log_size(message)
+
logger.add(
- os.path.join(
- log_config.get("log_dir", "tmp"),
- log_config.get("log_file", "server.log"),
- ),
+ sink,
format=log_format_file,
level=log_config.get("log_level", "INFO"),
filter=formatter,