import logging import os from datetime import datetime from config.network_config import network_config class Logger: """ 简单的日志操作类,支持控制台和文件输出 可以使用现有的logger对象或创建新的实例 """ _instance = None def __new__(cls, existing_logger=None, *args, **kwargs): if existing_logger is not None: # 如果提供了现有的logger对象,创建新实例并使用该对象 instance = super().__new__(cls) instance.logger = existing_logger return instance # 否则使用单例模式 if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def __init__(self, existing_logger=None, log_file="logs/app.log"): # 如果使用现有logger,直接返回 if existing_logger is not None: return # 如果已经初始化过,直接返回 if hasattr(self, 'logger'): return # 创建logs目录(如果不存在) os.makedirs(os.path.dirname(log_file), exist_ok=True) # 初始化logger self.logger = logging.getLogger('AppLogger') self.logger.setLevel(logging.DEBUG) # 清除可能存在的处理器 self.logger.handlers.clear() # 设置日志格式 formatter = logging.Formatter( '%(asctime)s [%(levelname)s] %(message)s', datefmt='%Y-%m-%d %H:%M:%S' ) # 添加控制台处理器 console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) self.logger.addHandler(console_handler) # 添加文件处理器 file_handler = logging.FileHandler(log_file, encoding='utf-8') file_handler.setFormatter(formatter) self.logger.addHandler(file_handler) def debug(self, message, strategy_id=None): """记录调试级别的日志""" self.logger.debug(message) try: network_config.insert_logs(strategy_id, "debug", message) except: pass def info(self, message, strategy_id=None): """记录信息级别的日志""" self.logger.info(message) try: network_config.insert_logs(strategy_id, "info ", message) except: pass def warning(self, message, strategy_id=None): """记录警告级别的日志""" self.logger.warning(message) try: network_config.insert_logs(strategy_id, "warn", message) except: pass def error(self, message, strategy_id=None): """记录错误级别的日志""" self.logger.error(message) try: network_config.insert_logs(strategy_id, "error", message) except: pass def critical(self, message, strategy_id=None): """记录严重错误级别的日志""" self.logger.critical(message) try: network_config.insert_logs(strategy_id, "critical", message) except: pass # # 使用示例 # if __name__ == "__main__": # # 示例1:创建新的logger实例 # logger = Logger() # logger.info("这是一个新创建的logger实例") # # # 示例2:使用现有的logger对象 # existing_logger = logging.getLogger('ExistingLogger') # existing_logger.setLevel(logging.DEBUG) # handler = logging.StreamHandler() # handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) # existing_logger.addHandler(handler) # # logger2 = Logger(existing_logger=existing_logger) # logger2.info("这是使用现有logger对象创建的实例") # # # 示例3:测试单例模式(不传入existing_logger时) # logger3 = Logger() # logger3.info("这条日志来自第三个logger实例(与第一个是同一个实例)")