SIT/utils/logger.py

103 lines
2.6 KiB
Python

"""
日志工具模块
提供统一的日志记录功能
"""
import logging
import sys
from logging.handlers import RotatingFileHandler
from pathlib import Path
from typing import Optional
from config import Config
class ColoredFormatter(logging.Formatter):
"""带颜色的日志格式化器(用于控制台输出)"""
# ANSI颜色代码
COLORS = {
'DEBUG': '\033[36m', # 青色
'INFO': '\033[32m', # 绿色
'WARNING': '\033[33m', # 黄色
'ERROR': '\033[31m', # 红色
'CRITICAL': '\033[35m', # 紫色
'RESET': '\033[0m' # 重置
}
def format(self, record):
"""格式化日志记录"""
log_color = self.COLORS.get(record.levelname, self.COLORS['RESET'])
record.levelname = f"{log_color}{record.levelname}{self.COLORS['RESET']}"
return super().format(record)
def setup_logger(
name: str,
level: Optional[str] = None,
log_file: Optional[Path] = None
) -> logging.Logger:
"""
设置日志记录器
Args:
name: 日志记录器名称
level: 日志级别
log_file: 日志文件路径
Returns:
配置好的日志记录器
"""
logger = logging.getLogger(name)
# 避免重复添加处理器
if logger.handlers:
return logger
# 设置日志级别
log_level = getattr(logging, level or Config.LOG_LEVEL)
logger.setLevel(log_level)
# 控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(log_level)
console_formatter = ColoredFormatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
console_handler.setFormatter(console_formatter)
logger.addHandler(console_handler)
# 文件处理器
if log_file or Config.LOG_FILE:
file_path = log_file or Config.LOG_FILE
file_path.parent.mkdir(parents=True, exist_ok=True)
file_handler = RotatingFileHandler(
file_path,
maxBytes=Config.LOG_MAX_BYTES,
backupCount=Config.LOG_BACKUP_COUNT,
encoding='utf-8'
)
file_handler.setLevel(log_level)
file_formatter = logging.Formatter(
Config.LOG_FORMAT,
datefmt='%Y-%m-%d %H:%M:%S'
)
file_handler.setFormatter(file_formatter)
logger.addHandler(file_handler)
return logger
def get_logger(name: str) -> logging.Logger:
"""
获取日志记录器
Args:
name: 日志记录器名称
Returns:
日志记录器实例
"""
return setup_logger(name)