Browse Source

feat: log 不同level报错

main
mckay 7 months ago
parent
commit
7b1484aed4
  1. 64
      brep2sdf/utils/logger.py

64
brep2sdf/utils/logger.py

@ -7,13 +7,15 @@ from datetime import datetime
class BRepLogger: class BRepLogger:
_instance = None _instance = None
def __new__(cls): def __new__(cls, log_level=logging.INFO, console_level=logging.INFO,
file_level=logging.DEBUG, include_trace=True):
if cls._instance is None: if cls._instance is None:
cls._instance = super().__new__(cls) cls._instance = super().__new__(cls)
cls._instance._initialize_logger() cls._instance._initialize_logger(log_level, console_level,
file_level, include_trace)
return cls._instance return cls._instance
def _initialize_logger(self): def _initialize_logger(self, log_level, console_level, file_level, include_trace):
"""初始化日志记录器""" """初始化日志记录器"""
# 创建logs目录 # 创建logs目录
log_dir = 'logs' log_dir = 'logs'
@ -21,45 +23,51 @@ class BRepLogger:
# 创建logger # 创建logger
self.logger = logging.getLogger('BRepLogger') self.logger = logging.getLogger('BRepLogger')
self.logger.setLevel(logging.DEBUG) self.logger.setLevel(log_level)
# 如果logger已经有处理器,则返回 # 如果logger已经有处理器,则返回
if self.logger.handlers: if self.logger.handlers:
return return
# 创建格式化器 # 创建格式化器
formatter = logging.Formatter( simple_formatter = logging.Formatter('%(levelname)s - %(message)s')
detailed_formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - ' '%(asctime)s - %(levelname)s - '
'%(filename)s:%(lineno)d in %(funcName)s - %(message)s' '%(filename)s:%(lineno)d in %(funcName)s - %(message)s'
) )
# 创建文件处理器 # 创建文件处理器 (详细日志)
current_time = datetime.now().strftime('%Y%m%d_%H%M%S') current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
log_file = os.path.join(log_dir, f'brep2sdf_{current_time}.log') log_file = os.path.join(log_dir, f'brep2sdf_{current_time}.log')
file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.DEBUG) file_handler.setLevel(file_level)
file_handler.setFormatter(formatter) file_handler.setFormatter(detailed_formatter)
# 创建控制台处理器 # 创建控制台处理器 (简略日志)
console_handler = logging.StreamHandler(sys.stdout) console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG) console_handler.setLevel(console_level)
console_handler.setFormatter(formatter) console_handler.setFormatter(simple_formatter)
# 添加处理器 # 添加处理器
self.logger.addHandler(file_handler) self.logger.addHandler(file_handler)
self.logger.addHandler(console_handler) self.logger.addHandler(console_handler)
# 保存配置
self.include_trace = include_trace
# 记录初始信息 # 记录初始信息
self.logger.info("="*50)
self.logger.info("BRep Logger initialized") self.logger.info("BRep Logger initialized")
self.logger.info(f"Log file: {log_file}") if file_level <= logging.DEBUG:
self.logger.info("="*50) self.logger.debug(f"Log file: {log_file}")
def debug(self, msg): def debug(self, msg):
"""带调用位置的调试信息""" """调试信息"""
if self.include_trace:
caller = traceback.extract_stack()[-2] caller = traceback.extract_stack()[-2]
filename = os.path.basename(caller.filename) filename = os.path.basename(caller.filename)
self.logger.debug(f"{msg} (in {filename})") self.logger.debug(f"{msg} (in {filename})")
else:
self.logger.debug(msg)
def info(self, msg): def info(self, msg):
self.logger.info(msg) self.logger.info(msg)
@ -67,16 +75,32 @@ class BRepLogger:
def warning(self, msg): def warning(self, msg):
self.logger.warning(msg) self.logger.warning(msg)
def error(self, msg, include_trace=True): def error(self, msg, include_trace=None):
"""错误信息,可选是否包含调用栈""" """错误信息"""
include_trace = self.include_trace if include_trace is None else include_trace
if include_trace: if include_trace:
self.logger.error(msg, exc_info=True, stack_info=True) self.logger.error(msg, exc_info=True, stack_info=True)
else: else:
self.logger.error(msg) self.logger.error(msg)
def exception(self, msg): def exception(self, msg):
"""异常信息,总是包含异常堆栈""" """异常信息"""
self.logger.exception(msg) self.logger.exception(msg)
# 创建全局logger实例 def setup_logger(name='BRepLogger', log_level='INFO', console_level='INFO',
logger = BRepLogger() 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 # 包含调用栈信息
)
Loading…
Cancel
Save