119 lines
3.8 KiB
Python
119 lines
3.8 KiB
Python
import logging
|
|
import os
|
|
import sys
|
|
from typing import Optional
|
|
|
|
class Logger:
|
|
"""全局日志管理类
|
|
|
|
使用单例模式实现的日志管理器,提供统一的日志记录接口。
|
|
可以在应用的任何位置使用该类记录日志。
|
|
"""
|
|
|
|
_instance: Optional['Logger'] = None
|
|
_logger: Optional[logging.Logger] = None
|
|
|
|
def __new__(cls) -> 'Logger':
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls)
|
|
cls._setup_logger()
|
|
return cls._instance
|
|
|
|
@classmethod
|
|
def get_instance(cls) -> 'Logger':
|
|
"""获取Logger单例实例
|
|
|
|
Returns:
|
|
Logger实例
|
|
"""
|
|
if cls._instance is None:
|
|
cls._instance = Logger()
|
|
return cls._instance
|
|
|
|
@classmethod
|
|
def _setup_logger(cls):
|
|
"""设置日志记录器
|
|
|
|
配置日志记录器的输出格式、日志级别和输出文件。
|
|
"""
|
|
if cls._logger is None:
|
|
cls._logger = logging.getLogger('StreamDock')
|
|
cls._logger.setLevel(logging.INFO)
|
|
|
|
# 获取日志目录路径
|
|
if getattr(sys, 'frozen', False):
|
|
# 如果是打包后的exe
|
|
base_path = os.path.join(os.path.dirname(sys.executable), 'logs')
|
|
else:
|
|
# 如果是开发环境
|
|
base_path = os.path.join(os.path.dirname(os.path.dirname(os.path.dirname(__file__))), 'logs')
|
|
|
|
# 确保日志目录存在
|
|
try:
|
|
os.makedirs(base_path, exist_ok=True)
|
|
|
|
# 设置日志文件路径
|
|
log_file = os.path.join(base_path, 'plugin.log')
|
|
|
|
# 创建文件处理器
|
|
handler = logging.FileHandler(log_file, encoding='utf-8')
|
|
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
|
cls._logger.addHandler(handler)
|
|
|
|
# 添加控制台输出
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
|
cls._logger.addHandler(console_handler)
|
|
except Exception as e:
|
|
print(f"Failed to setup file handler: {e}")
|
|
# 如果文件处理器设置失败,至少确保控制台输出正常工作
|
|
console_handler = logging.StreamHandler()
|
|
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
|
cls._logger.addHandler(console_handler)
|
|
|
|
@classmethod
|
|
def get_logger(cls) -> logging.Logger:
|
|
"""获取日志记录器实例
|
|
|
|
Returns:
|
|
配置好的日志记录器实例
|
|
"""
|
|
if cls._logger is None:
|
|
cls._setup_logger()
|
|
return cls._logger
|
|
|
|
@classmethod
|
|
def info(cls, message: str):
|
|
"""记录INFO级别的日志
|
|
|
|
Args:
|
|
message: 日志消息
|
|
"""
|
|
cls.get_instance().get_logger().info(message)
|
|
|
|
@classmethod
|
|
def error(cls, message: str):
|
|
"""记录ERROR级别的日志
|
|
|
|
Args:
|
|
message: 日志消息
|
|
"""
|
|
cls.get_instance().get_logger().error(message)
|
|
|
|
@classmethod
|
|
def warning(cls, message: str):
|
|
"""记录WARNING级别的日志
|
|
|
|
Args:
|
|
message: 日志消息
|
|
"""
|
|
cls.get_instance().get_logger().warning(message)
|
|
|
|
@classmethod
|
|
def debug(cls, message: str):
|
|
"""记录DEBUG级别的日志
|
|
|
|
Args:
|
|
message: 日志消息
|
|
"""
|
|
cls.get_instance().get_logger().debug(message) |