101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
# -*- coding:utf-8 -*-
|
||
# 日志管理模块
|
||
|
||
import os
|
||
import logging
|
||
from typing import Optional
|
||
from datetime import datetime
|
||
|
||
class LoggerManager:
|
||
"""日志管理类,用于配置和创建日志器"""
|
||
|
||
@staticmethod
|
||
def setup_logger(name: str, log_file: Optional[str] = None,
|
||
level: int = logging.INFO,
|
||
format_str: str = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||
console_output: bool = True) -> logging.Logger:
|
||
"""
|
||
设置并返回一个日志器
|
||
|
||
Args:
|
||
name: 日志器名称
|
||
log_file: 日志文件路径,None表示不输出到文件
|
||
level: 日志级别
|
||
format_str: 日志格式
|
||
console_output: 是否输出到控制台
|
||
|
||
Returns:
|
||
配置好的日志器
|
||
"""
|
||
# 创建日志器
|
||
logger = logging.getLogger(name)
|
||
logger.setLevel(level)
|
||
|
||
# 创建格式化器
|
||
formatter = logging.Formatter(format_str)
|
||
|
||
# 如果指定了日志文件
|
||
if log_file:
|
||
# 确保日志目录存在
|
||
log_dir = os.path.dirname(log_file)
|
||
if log_dir and not os.path.exists(log_dir):
|
||
os.makedirs(log_dir)
|
||
|
||
# 创建文件处理器
|
||
file_handler = logging.FileHandler(log_file)
|
||
file_handler.setFormatter(formatter)
|
||
logger.addHandler(file_handler)
|
||
|
||
# 如果需要输出到控制台
|
||
if console_output:
|
||
# 创建控制台处理器
|
||
console_handler = logging.StreamHandler()
|
||
console_handler.setFormatter(formatter)
|
||
logger.addHandler(console_handler)
|
||
|
||
return logger
|
||
|
||
@staticmethod
|
||
def get_timestamped_log_path(base_dir: str, prefix: str, ext: str = '.log') -> str:
|
||
"""
|
||
生成带时间戳的日志文件路径
|
||
|
||
Args:
|
||
base_dir: 基础目录
|
||
prefix: 文件名前缀
|
||
ext: 文件扩展名
|
||
|
||
Returns:
|
||
完整的日志文件路径
|
||
"""
|
||
# 确保基础目录存在
|
||
if not os.path.exists(base_dir):
|
||
os.makedirs(base_dir)
|
||
|
||
# 生成时间戳
|
||
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
|
||
|
||
# 构建文件名
|
||
filename = f"{prefix}_{timestamp}{ext}"
|
||
|
||
return os.path.join(base_dir, filename)
|
||
|
||
# 创建一个全局日志器
|
||
def get_logger(name: str = 'repo_test', log_file: Optional[str] = None,
|
||
level: int = logging.INFO) -> logging.Logger:
|
||
"""
|
||
获取全局日志器
|
||
|
||
Args:
|
||
name: 日志器名称
|
||
log_file: 日志文件路径
|
||
level: 日志级别
|
||
|
||
Returns:
|
||
日志器
|
||
"""
|
||
return LoggerManager.setup_logger(name, log_file, level)
|
||
|
||
# 默认日志器
|
||
default_logger = get_logger()
|