diff --git a/src/functor/audiochunk.py b/src/functor/audiochunk.py index f7405ac..ad1fbae 100644 --- a/src/functor/audiochunk.py +++ b/src/functor/audiochunk.py @@ -5,16 +5,12 @@ """ import numpy as np -import logging +from src.utils.logger import get_module_logger from typing import List, Optional, Union from src.models import AudioBinary_Config # 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger('AudioChunk') +logger = get_module_logger(__name__, level="INFO") class AudioChunk: """音频数据块管理类,用于存储和处理16KHz音频数据""" diff --git a/src/logic_trager.py b/src/logic_trager.py index 68c8cdd..5c3ac43 100644 --- a/src/logic_trager.py +++ b/src/logic_trager.py @@ -4,15 +4,10 @@ 逻辑触发器类 - 用于处理音频数据并触发相应的处理逻辑 """ -import logging +from src.utils.logger import get_module_logger from typing import Any, Dict, Type, Callable - # 配置日志 -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger('LogicTrager') +logger = get_module_logger(__name__, level="INFO") class AutoAfterMeta(type): """ @@ -143,7 +138,7 @@ class LogicTrager(metaclass=AutoAfterMeta): """ 音频处理 """ - print("LogicTrager push_audio_chunk [{}ms:{}ms] (len={})".format(chunk.start_time, chunk.end_time, len(chunk.chunk))) + logger.info("LogicTrager push_audio_chunk [{}ms:{}ms] (len={})".format(chunk.start_time, chunk.end_time, len(chunk.chunk))) self._audio_chunk.append(chunk) def __after__push_audio_chunk(self) -> None: diff --git a/src/utils/logger.py b/src/utils/logger.py new file mode 100644 index 0000000..b8f5f12 --- /dev/null +++ b/src/utils/logger.py @@ -0,0 +1,91 @@ +import logging +import sys +from pathlib import Path +from typing import Optional + +def setup_logger( + name: str = None, + level: str = "INFO", + log_file: Optional[str] = None, + log_format: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + date_format: str = "%Y-%m-%d %H:%M:%S", +) -> logging.Logger: + """ + 设置并返回一个配置好的logger实例 + + Args: + name: logger的名称,默认为None(使用root logger) + level: 日志级别,默认为"INFO" + log_file: 日志文件路径,默认为None(仅控制台输出) + log_format: 日志格式 + date_format: 日期格式 + + Returns: + logging.Logger: 配置好的logger实例 + """ + # 获取logger实例 + logger = logging.getLogger(name) + + # 设置日志级别 + level = getattr(logging, level.upper()) + logger.setLevel(level) + + print(f"添加处理器 {name} {log_file} {log_format} {date_format}") + # 创建格式器 + formatter = logging.Formatter(log_format, date_format) + + # 添加控制台处理器 + console_handler = logging.StreamHandler(sys.stdout) + console_handler.setFormatter(formatter) + logger.addHandler(console_handler) + + # 如果指定了日志文件,添加文件处理器 + if log_file: + # 确保日志目录存在 + log_path = Path(log_file) + log_path.parent.mkdir(parents=True, exist_ok=True) + + file_handler = logging.FileHandler(log_file, encoding='utf-8') + file_handler.setFormatter(formatter) + logger.addHandler(file_handler) + + # 注意:移除了 propagate = False,允许日志传递 + return logger + +def setup_root_logger( + level: str = "INFO", + log_file: Optional[str] = None +) -> None: + """ + 配置根日志器 + + Args: + level: 日志级别 + log_file: 日志文件路径 + """ + setup_logger(None, level, log_file) + +def get_module_logger( + module_name: str, + level: Optional[str] = None, # 改为可选参数 + log_file: Optional[str] = None # 一般不需要单独指定 +) -> logging.Logger: + """ + 获取模块级别的logger + + Args: + module_name: 模块名称,通常传入__name__ + level: 可选的日志级别,如果不指定则继承父级配置 + log_file: 可选的日志文件路径,一般不需要指定 + """ + logger = logging.getLogger(module_name) + + # 只有显式指定了level才设置 + if level: + logger.setLevel(getattr(logging, level.upper())) + + # 只有显式指定了log_file才添加文件处理器 + if log_file: + setup_logger(module_name, level or "INFO", log_file) + + return logger \ No newline at end of file diff --git a/test_main.py b/test_main.py index 9f0c069..c5682ab 100644 --- a/test_main.py +++ b/test_main.py @@ -1,4 +1,14 @@ +from src.utils.logger import get_module_logger, setup_root_logger from tests.modelsuse import vad_model_use_online_logic +setup_root_logger(level="INFO",log_file="logs/test_main.log") + +logger = get_module_logger(__name__) + +logger.info("开始测试") vad_result = vad_model_use_online_logic("tests/vad_example.wav") -print(vad_result) \ No newline at end of file +logger.info("测试结束") +if vad_result is None: + logger.warning("VAD结果为空") +else: + logger.info(f"VAD结果: {vad_result}") \ No newline at end of file