103 lines
2.6 KiB
Python
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)
|