From 4cc7247c3733c9c88f343c7432731e9b296e6a88 Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Wed, 4 Jun 2025 14:35:21 +0800 Subject: [PATCH 1/5] =?UTF-8?q?update:funasr=E5=AE=9E=E4=BE=8B=E4=B9=8B?= =?UTF-8?q?=E5=89=8D=E6=B7=BB=E5=8A=A0=E5=86=85=E5=AD=98=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/core/providers/asr/fun_local.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/main/xiaozhi-server/core/providers/asr/fun_local.py b/main/xiaozhi-server/core/providers/asr/fun_local.py index 8c7305c6..4b25a265 100644 --- a/main/xiaozhi-server/core/providers/asr/fun_local.py +++ b/main/xiaozhi-server/core/providers/asr/fun_local.py @@ -2,6 +2,7 @@ import time import os import sys import io +import psutil from config.logger import setup_logging from typing import Optional, Tuple, List from core.providers.asr.base import ASRProviderBase @@ -37,6 +38,13 @@ class CaptureOutput: class ASRProvider(ASRProviderBase): def __init__(self, config: dict, delete_audio_file: bool): super().__init__() + + # 内存检测,要求大于2G + min_mem_bytes = 2 * 1024 * 1024 * 1024 + total_mem = psutil.virtual_memory().total + if total_mem < min_mem_bytes: + logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB") + self.interface_type = InterfaceType.LOCAL self.model_dir = config.get("model_dir") self.output_dir = config.get("output_dir") # 修正配置键名 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 2/5] =?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, From fba758ea36024629236e80359fc9d8f8dbc9f68f Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Wed, 4 Jun 2025 15:42:52 +0800 Subject: [PATCH 3/5] =?UTF-8?q?update:=E6=81=A2=E5=A4=8D=E6=9C=80=E5=88=9D?= =?UTF-8?q?=E7=9A=84=E6=97=A5=E5=BF=97=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config/logger.py | 93 +++++----------------------- 1 file changed, 17 insertions(+), 76 deletions(-) diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index e5bf8466..643952dd 100644 --- a/main/xiaozhi-server/config/logger.py +++ b/main/xiaozhi-server/config/logger.py @@ -3,16 +3,15 @@ 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" +SERVER_VERSION = "0.5.4" _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" @@ -21,6 +20,7 @@ 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,59 +32,12 @@ 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() @@ -99,7 +52,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}", @@ -119,7 +72,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_file = log_config.get("log_file", "server.log") data_dir = log_config.get("data_dir", "data") os.makedirs(log_dir, exist_ok=True) @@ -131,23 +84,18 @@ 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( - sink, + os.path.join(log_dir, log_file), 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"更新日志配置组件") @@ -178,9 +126,6 @@ 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, @@ -188,15 +133,11 @@ 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( - sink, + 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, From 8df9846ad7b89c4d91528599d3bbe5b9c4922e84 Mon Sep 17 00:00:00 2001 From: CGD <3030332422@qq.com> Date: Thu, 5 Jun 2025 09:46:54 +0800 Subject: [PATCH 4/5] =?UTF-8?q?update:=E6=94=B9=E4=B8=BA=E9=87=87=E7=94=A8?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BD=AE=E8=BD=AC=E6=9C=BA=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8=E6=B8=85?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/xiaozhi-server/config/logger.py | 40 ++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/main/xiaozhi-server/config/logger.py b/main/xiaozhi-server/config/logger.py index 643952dd..7bd22c43 100644 --- a/main/xiaozhi-server/config/logger.py +++ b/main/xiaozhi-server/config/logger.py @@ -3,6 +3,7 @@ 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.4" _logger_initialized = False @@ -59,7 +60,7 @@ def setup_logging(): ) 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}", + "{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}", ) selected_module_str = logger._core.extra["selected_module"] @@ -84,12 +85,23 @@ def setup_logging(): # 输出到控制台 logger.add(sys.stdout, format=log_format, level=log_level, filter=formatter) - # 输出到文件 + # 输出到文件 - 统一目录,按大小轮转 + # 日志文件完整路径 + log_file_path = os.path.join(log_dir, log_file) + + # 添加日志处理器 logger.add( - os.path.join(log_dir, log_file), + log_file_path, 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, ) _logger_initialized = True # 标记为已初始化 @@ -116,7 +128,7 @@ def update_module_string(selected_module_str): ) 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}", + "{time:YYYY-MM-DD HH:mm:ss} - {version}_{extra[selected_module]} - {name} - {level} - {extra[tag]} - {message}", ) log_format = log_format.replace("{version}", SERVER_VERSION) @@ -133,14 +145,26 @@ def update_module_string(selected_module_str): 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( - os.path.join( - log_config.get("log_dir", "tmp"), - log_config.get("log_file", "server.log"), - ), + 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: From 3eb3a4502f7b651b460576feb552c15670dd4b2a Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Fri, 6 Jun 2025 14:08:38 +0800 Subject: [PATCH 5/5] Update fun_local.py --- main/xiaozhi-server/core/providers/asr/fun_local.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/xiaozhi-server/core/providers/asr/fun_local.py b/main/xiaozhi-server/core/providers/asr/fun_local.py index 4b25a265..e907bdce 100644 --- a/main/xiaozhi-server/core/providers/asr/fun_local.py +++ b/main/xiaozhi-server/core/providers/asr/fun_local.py @@ -43,7 +43,7 @@ class ASRProvider(ASRProviderBase): min_mem_bytes = 2 * 1024 * 1024 * 1024 total_mem = psutil.virtual_memory().total if total_mem < min_mem_bytes: - logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB") + logger.bind(tag=TAG).error(f"可用内存不足2G,当前仅有 {total_mem / (1024*1024):.2f} MB,可能无法启动FunASR") self.interface_type = InterfaceType.LOCAL self.model_dir = config.get("model_dir")