diff --git a/brep2sdf/utils/logger.py b/brep2sdf/utils/logger.py index 5691eb9..c386cae 100644 --- a/brep2sdf/utils/logger.py +++ b/brep2sdf/utils/logger.py @@ -7,13 +7,15 @@ from datetime import datetime class BRepLogger: _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: cls._instance = super().__new__(cls) - cls._instance._initialize_logger() + cls._instance._initialize_logger(log_level, console_level, + file_level, include_trace) return cls._instance - def _initialize_logger(self): + def _initialize_logger(self, log_level, console_level, file_level, include_trace): """初始化日志记录器""" # 创建logs目录 log_dir = 'logs' @@ -21,45 +23,51 @@ class BRepLogger: # 创建logger self.logger = logging.getLogger('BRepLogger') - self.logger.setLevel(logging.DEBUG) + self.logger.setLevel(log_level) # 如果logger已经有处理器,则返回 if self.logger.handlers: return # 创建格式化器 - formatter = logging.Formatter( + 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(logging.DEBUG) - file_handler.setFormatter(formatter) + file_handler.setLevel(file_level) + file_handler.setFormatter(detailed_formatter) - # 创建控制台处理器 + # 创建控制台处理器 (简略日志) console_handler = logging.StreamHandler(sys.stdout) - console_handler.setLevel(logging.DEBUG) - console_handler.setFormatter(formatter) + 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("="*50) self.logger.info("BRep Logger initialized") - self.logger.info(f"Log file: {log_file}") - self.logger.info("="*50) + if file_level <= logging.DEBUG: + self.logger.debug(f"Log file: {log_file}") def debug(self, msg): - """带调用位置的调试信息""" - caller = traceback.extract_stack()[-2] - filename = os.path.basename(caller.filename) - self.logger.debug(f"{msg} (in {filename})") + """调试信息""" + 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) @@ -67,16 +75,32 @@ class BRepLogger: def warning(self, 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: self.logger.error(msg, exc_info=True, stack_info=True) else: self.logger.error(msg) def exception(self, msg): - """异常信息,总是包含异常堆栈""" + """异常信息""" self.logger.exception(msg) -# 创建全局logger实例 -logger = BRepLogger() \ No newline at end of file +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 # 包含调用栈信息 +) \ No newline at end of file