You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python无法记录存储过程的错误与成功日志问题求助

问题分析与解决方案

问题描述

编写了一段Python代码用于调用数据库存储过程并记录日志,数据库连接成功/失败的日志能正常写入文件,但执行存储过程的代码段的错误与成功日志无法写入:

with cnxn.cursor() as cur:
    try:
        cur.execute(logging_sp_query)
    except Exception as e:
        logger.error("Unable to execute query: %s", e)        
    else:
        cnxn.commit()
cnxn.close()  # Close the connection 

尝试过logger.error、logger.info、logging.error等调用方式,以及捕获pm.err.OperationalError特定异常,均未解决。

核心原因

  • 模块命名冲突:代码同时导入了logging模块和第三方logger模块,logging_sp方法中调用的logger.error实际引用的是logger模块,而非初始化好的日志器对象,导致日志无法输出到正确的handler。
  • 缺少成功场景日志:当前代码仅在执行失败时尝试记录日志,成功场景下没有添加任何日志输出逻辑。
  • 日志器使用不统一:部分代码用logging.error调用根日志器,部分用未正确获取的logger对象,日志行为不一致。
  • 静态方法未声明:is_Windows和setup_logger作为类方法未添加@staticmethod装饰器,可能导致调用异常。

修复步骤

  1. 解决命名冲突
    删除不必要的import logger语句;若必须使用该模块,重命名导入避免冲突:

    import logger as external_logger
    
  2. 统一日志器获取
    在需要记录日志的方法中,通过logging.getLogger()获取初始化好的根日志器,修改logging_sp方法:

    def logging_sp(self):
        logging_sp_query = """
        stored procedure code here
        """
        logger = logging.getLogger()  # 获取根日志器
        cnxn = self.DB_connection()
        if cnxn is None:
            logger.error("Database connection is None. Cannot proceed.")
            return
            
        with cnxn.cursor() as cur:
            try:
                cur.execute(logging_sp_query)
                logger.info("存储过程执行成功并提交")  # 添加成功日志
            except Exception as e:
                logger.error("Unable to execute query: %s", str(e))        
            else:
                cnxn.commit()
        cnxn.close()
    
  3. 修正静态方法定义
    给is_Windows和setup_logger添加@staticmethod装饰器:

    @staticmethod
    def is_Windows():
        return "win" in platform.system().lower()
    
    @staticmethod
    def setup_logger():
        logger = logging.getLogger()
        logger.setLevel(logging.DEBUG)
        
        log_filename = f"E:\\here\\log\\file\\log-{date.today()}.log"
        file_handler = TimedRotatingFileHandler(log_filename, when="midnight", backupCount=7)
        file_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        
        console_handler = logging.StreamHandler()
        console_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
        
        logger.addHandler(file_handler)
        logger.addHandler(console_handler)
        return logger 
    
  4. 优化配置加载逻辑
    DB_connection方法中存在配置加载冗余(先通过self.get_config()获取,后又重新加载文件覆盖),确认配置来源后统一逻辑,避免连接参数不一致:

    def DB_connection(self):
        connection = None
        logger = logging.getLogger()
        try:
            # 统一从指定配置文件加载
            config_file_path = os.path.join(os.path.dirname(__file__), 'DB_conn_info_local.json')
            with open(config_file_path) as config_file:
                config = json.load(config_file)
            
            host=config["log-output"]["database-secrets"]["host"]
            port=config["log-output"]["database-secrets"]["port"]
            database=config["log-output"]["database-secrets"]["db"]
            username=config["log-output"]["database-secrets"]["username"]
            password=config["log-output"]["database-secrets"]["password"]
    
            connection = pm.connect(user=username,password=password,host=host,port=port,database=database)
            logger.info("Successfully connected to database")
    
        except Exception as e:
            logger.error("Unable to connect to database: %s", str(e))
        
        return connection
    

内容的提问来源于stack exchange,提问作者Forgottenluv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 07:59:52