You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
3.7 KiB
106 lines
3.7 KiB
import os
|
|
import sys
|
|
import logging
|
|
import traceback
|
|
from datetime import datetime
|
|
|
|
class BRepLogger:
|
|
_instance = None
|
|
|
|
def __new__(cls, log_level=logging.INFO, console_level=logging.INFO,
|
|
file_level=logging.DEBUG, include_trace=True):
|
|
if cls._instance is None:
|
|
cls._instance = super().__new__(cls)
|
|
cls._instance._initialize_logger(log_level, console_level,
|
|
file_level, include_trace)
|
|
return cls._instance
|
|
|
|
def _initialize_logger(self, log_level, console_level, file_level, include_trace):
|
|
"""初始化日志记录器"""
|
|
# 创建logs目录
|
|
log_dir = 'logs'
|
|
os.makedirs(log_dir, exist_ok=True)
|
|
|
|
# 创建logger
|
|
self.logger = logging.getLogger('BRepLogger')
|
|
self.logger.setLevel(log_level)
|
|
|
|
# 如果logger已经有处理器,则返回
|
|
if self.logger.handlers:
|
|
return
|
|
|
|
# 创建格式化器
|
|
simple_formatter = logging.Formatter('%(levelname)s - %(message)s')
|
|
detailed_formatter = logging.Formatter(
|
|
'%(asctime)s - %(levelname)s - '
|
|
'%(filename)s:%(lineno)d in %(funcName)s - %(message)s'
|
|
)
|
|
|
|
# 创建文件处理器 (详细日志)
|
|
current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
|
|
log_file = os.path.join(log_dir, f'brep2sdf_{current_time}.log')
|
|
file_handler = logging.FileHandler(log_file, encoding='utf-8')
|
|
file_handler.setLevel(file_level)
|
|
file_handler.setFormatter(detailed_formatter)
|
|
|
|
# 创建控制台处理器 (简略日志)
|
|
console_handler = logging.StreamHandler(sys.stdout)
|
|
console_handler.setLevel(console_level)
|
|
console_handler.setFormatter(simple_formatter)
|
|
|
|
# 添加处理器
|
|
self.logger.addHandler(file_handler)
|
|
self.logger.addHandler(console_handler)
|
|
|
|
# 保存配置
|
|
self.include_trace = include_trace
|
|
|
|
# 记录初始信息
|
|
self.logger.info("BRep Logger initialized")
|
|
if file_level <= logging.DEBUG:
|
|
self.logger.debug(f"Log file: {log_file}")
|
|
|
|
def debug(self, msg):
|
|
"""调试信息"""
|
|
if self.include_trace:
|
|
caller = traceback.extract_stack()[-2]
|
|
filename = os.path.basename(caller.filename)
|
|
self.logger.debug(f"{msg} (in {filename})")
|
|
else:
|
|
self.logger.debug(msg)
|
|
|
|
def info(self, msg):
|
|
self.logger.info(msg)
|
|
|
|
def warning(self, msg):
|
|
self.logger.warning(msg)
|
|
|
|
def error(self, msg, include_trace=None):
|
|
"""错误信息"""
|
|
include_trace = self.include_trace if include_trace is None else include_trace
|
|
if include_trace:
|
|
self.logger.error(msg, exc_info=True, stack_info=True)
|
|
else:
|
|
self.logger.error(msg)
|
|
|
|
def exception(self, msg):
|
|
"""异常信息"""
|
|
self.logger.exception(msg)
|
|
|
|
def setup_logger(name='BRepLogger', log_level='INFO', console_level='INFO',
|
|
file_level='DEBUG', include_trace=True):
|
|
"""创建logger的便捷函数"""
|
|
# 直接从logging获取对应的级别常量
|
|
log_level = getattr(logging, log_level.upper())
|
|
console_level = getattr(logging, console_level.upper())
|
|
file_level = getattr(logging, file_level.upper())
|
|
|
|
return BRepLogger(log_level, console_level, file_level, include_trace)
|
|
|
|
# 使用默认配置创建全局logger实例
|
|
logger = setup_logger(
|
|
log_level='DEBUG', # 记录所有级别日志
|
|
console_level='DEBUG', # 控制台显示所有日志
|
|
file_level='DEBUG', # 文件记录所有日志
|
|
include_trace=True # 包含调用栈信息
|
|
)
|