Files
xian_algorithm_new/app/utils/logger.py
T

105 lines
3.1 KiB
Python
Raw Normal View History

2026-05-05 19:49:12 +08:00
"""
日志配置工具
"""
import logging
import sys
from pathlib import Path
from logging.handlers import RotatingFileHandler, TimedRotatingFileHandler
from datetime import datetime
class LoggerConfig:
"""日志配置类"""
def __init__(self, log_dir: str = "logs", log_level: str = "INFO"):
self.log_dir = Path(log_dir)
self.log_level = getattr(logging, log_level.upper(), logging.INFO)
self.ensure_log_directory()
def ensure_log_directory(self):
"""确保日志目录存在"""
if not self.log_dir.exists():
self.log_dir.mkdir(parents=True, exist_ok=True)
def setup_logger(
self,
name: str = "app",
log_file: str = None,
max_bytes: int = 10 * 1024 * 1024, # 10MB
backup_count: int = 5,
use_timed_rotation: bool = False
) -> logging.Logger:
"""配置日志记录器
Args:
name: 日志记录器名称
log_file: 日志文件名(None则使用时间戳)
max_bytes: 单个日志文件最大大小
backup_count: 保留的备份文件数量
use_timed_rotation: 是否使用按时间轮转
Returns:
配置好的Logger实例
"""
logger = logging.getLogger(name)
logger.setLevel(self.log_level)
# 避免重复添加handler
if logger.handlers:
return logger
# 创建formatter
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# 控制台handler
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(self.log_level)
console_handler.setFormatter(formatter)
logger.addHandler(console_handler)
# 文件handler
if log_file is None:
timestamp = datetime.now().strftime("%Y%m%d")
log_file = f"app_{timestamp}.log"
log_path = self.log_dir / log_file
if use_timed_rotation:
# 按时间轮转(每天)
file_handler = TimedRotatingFileHandler(
log_path,
when='midnight',
interval=1,
backupCount=backup_count,
encoding='utf-8'
)
else:
# 按大小轮转
file_handler = RotatingFileHandler(
log_path,
maxBytes=max_bytes,
backupCount=backup_count,
encoding='utf-8'
)
file_handler.setLevel(self.log_level)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
return logger
@staticmethod
def get_logger(name: str = "app") -> logging.Logger:
"""获取logger实例"""
return logging.getLogger(name)
# 全局日志配置
def setup_logging(log_dir: str = "logs", log_level: str = "INFO") -> logging.Logger:
"""设置全局日志"""
logger_config = LoggerConfig(log_dir, log_level)
return logger_config.setup_logger()