"""
统一日志工具模块
使用loguru实现按天生成日志文件,统一项目日志格式
"""
import sys
from pathlib import Path
from loguru import logger
from config.config.settings import config
# 全局logger实例
_global_logger = None
def setup_logger(name='robot_ai', log_dir='logs'):
"""
设置统一的日志记录器
Args:
name: 日志记录器名称
log_dir: 日志文件目录
Returns:
logger: 配置好的日志记录器
"""
global _global_logger
# 创建日志目录
log_path = Path(log_dir)
log_path.mkdir(exist_ok=True)
# 移除默认的处理器
logger.remove()
# 添加控制台处理器
logger.add(
sys.stdout,
format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {name}:{function}:{line} - {message}",
level=config.LOG_LEVEL,
colorize=True
)
# 添加文件处理器(按天轮转)
log_file = log_path / f"{name}.log"
logger.add(
log_file,
format="{time:YYYY-MM-DD HH:mm:ss.SSS} | {level: <8} | {name}:{function}:{line} - {message}",
level=config.LOG_LEVEL,
rotation="00:00", # 每天午夜轮转
retention="30 days", # 保留30天
compression="zip", # 压缩旧日志
encoding="utf-8",
enqueue=True # 异步写入
)
_global_logger = logger
return logger
def get_logger(name=None):
"""
获取日志记录器
Args:
name: 模块名称,如果为None则使用调用模块的名称
Returns:
logger: 日志记录器
"""
if name is None:
# 获取调用模块的名称
import inspect
frame = inspect.currentframe().f_back
name = frame.f_globals.get('__name__', 'robot_ai')
# 如果还没有初始化,先初始化
if _global_logger is None:
setup_logger()
# 返回绑定模块名的logger
return _global_logger.bind(name=name)
# 初始化根日志记录器
setup_logger('robot_ai', 'logs')
# 导出统一的logger接口 - 直接导出loguru的logger
__all__ = ['setup_logger', 'get_logger', 'logger']