Files
xian_algorithm_new/app/utils/logger.py
T

90 lines
2.3 KiB
Python
Raw Normal View History

2026-05-05 19:49:12 +08:00
"""
2026-05-08 15:42:32 +08:00
日志工具类
支持按天分割、自动清理过期日志
2026-05-05 19:49:12 +08:00
"""
import logging
from pathlib import Path
2026-05-08 15:42:32 +08:00
from logging.handlers import TimedRotatingFileHandler
from datetime import datetime, timedelta
2026-05-05 19:49:12 +08:00
2026-05-08 15:42:32 +08:00
class LoggerManager:
"""日志管理器"""
_loggers = {}
@classmethod
def get_logger(cls, name: str = "algorithm", log_dir: str = "logs") -> logging.Logger:
"""
获取日志记录器
2026-05-05 19:49:12 +08:00
Args:
2026-05-08 15:42:32 +08:00
name: 日志名称
log_dir: 日志目录
2026-05-05 19:49:12 +08:00
Returns:
2026-05-08 15:42:32 +08:00
logging.Logger 实例
2026-05-05 19:49:12 +08:00
"""
2026-05-08 15:42:32 +08:00
if name in cls._loggers:
return cls._loggers[name]
# 创建日志目录
log_path = Path(log_dir)
log_path.mkdir(parents=True, exist_ok=True)
# 创建 logger
2026-05-05 19:49:12 +08:00
logger = logging.getLogger(name)
2026-05-08 15:42:32 +08:00
logger.setLevel(logging.DEBUG)
# 避免重复添加 handler
2026-05-05 19:49:12 +08:00
if logger.handlers:
2026-05-08 15:42:32 +08:00
cls._loggers[name] = logger
2026-05-05 19:49:12 +08:00
return logger
2026-05-08 15:42:32 +08:00
# 日志格式
2026-05-05 19:49:12 +08:00
formatter = logging.Formatter(
2026-05-08 15:42:32 +08:00
'%(asctime)s [%(threadName)s] %(levelname)-5s %(name)s - %(message)s',
2026-05-05 19:49:12 +08:00
datefmt='%Y-%m-%d %H:%M:%S'
)
2026-05-08 15:42:32 +08:00
# 控制台 Handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)
2026-05-05 19:49:12 +08:00
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
2026-05-08 15:42:32 +08:00
# 文件 Handler - 按天分割
log_file = log_path / f"{name}.log"
file_handler = TimedRotatingFileHandler(
filename=str(log_file),
when='midnight',
interval=1,
backupCount=7,
encoding='utf-8'
)
file_handler.setLevel(logging.DEBUG)
2026-05-05 19:49:12 +08:00
file_handler.setFormatter(formatter)
2026-05-08 15:42:32 +08:00
# 设置日志文件命名格式
file_handler.suffix = "%Y-%m-%d.log"
2026-05-05 19:49:12 +08:00
logger.addHandler(file_handler)
2026-05-08 15:42:32 +08:00
cls._loggers[name] = logger
2026-05-05 19:49:12 +08:00
return logger
2026-05-08 15:42:32 +08:00
# 便捷函数
def get_logger(name: str = "algorithm", log_dir: str = "logs") -> logging.Logger:
"""
获取日志记录器的便捷函数
Args:
name: 日志名称
log_dir: 日志目录
Returns:
logging.Logger 实例
"""
return LoggerManager.get_logger(name, log_dir)