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

如何在Lambda函数中添加错误日志?并实现执行成功提示

问题解决方案

一、修正并优化后的代码

import logging
import mariadb as mdb

# 配置日志级别,确保INFO及以上级别日志能输出
logging.basicConfig(level=logging.INFO)

def name_of_handler(event=None, context=None):
    cnxn = None
    cur = None
    try:
        # 将数据库连接移至handler内部,避免Lambda容器复用导致的连接失效问题
        cnxn = mdb.connect(
            user="username",  # 建议后续改为从环境变量获取,避免硬编码
            password="pass",
            host="host",
            port=port,
            database="database"
        )
        cur = cnxn.cursor()
        SQL_QUERY = "CALL STORED_PROCEDURE();"
        
        cur.execute(SQL_QUERY)
        cnxn.commit()
        
        # 添加执行成功的日志提示
        logging.info("存储过程执行完成,记录已成功插入数据库")
        
        # 获取查询结果并返回(如果需要在Lambda响应中返回结果)
        row = cur.fetchone()
        logging.info(f"查询结果: {row}")
        return {"statusCode": 200, "message": "执行成功", "data": row}
        
    except mdb.Error as e:
        # 详细记录数据库错误,包括错误码和信息
        logging.error(f"数据库执行错误 - 错误码: {e.args[0]}, 错误信息: {e.args[1]}")
        # 发生错误时回滚事务
        if cnxn:
            cnxn.rollback()
        return {"statusCode": 500, "error": f"数据库错误: {e.args[1]}"}
    except Exception as e:
        # 记录通用异常的完整栈跟踪,便于排查问题
        logging.exception("执行过程中发生未预期的异常")
        return {"statusCode": 500, "error": "未知异常"}
    finally:
        # 确保游标和连接无论成功失败都能关闭
        if cur:
            cur.close()
        if cnxn:
            cnxn.close()

# 本地测试时调用,部署到Lambda后无需此调用(Lambda会自动触发handler)
if __name__ == "__main__":
    name_of_handler()

二、日志补充说明

  • 数据库异常日志:针对mdb.Error捕获数据库特定错误,记录错误码和详细信息,精准定位连接、SQL语法或权限类问题。
  • 通用异常日志:使用logging.exception自动记录异常的完整栈跟踪,比单纯打印错误信息更便于排查隐藏问题。
  • 成功日志:在事务提交后添加INFO级别的成功提示,确认业务流程正常完成,同时记录查询结果,方便后续核对。
  • 弃用print输出日志:Lambda日志会统一收集到CloudWatch,logging模块能更好地适配日志级别和格式,便于后续筛选分析。

三、Lambda函数编写关键流程要点

  • handler函数作为唯一入口:所有业务逻辑必须放在handler内部,禁止在handler外执行数据库连接、业务操作等代码——Lambda冷启动时会执行handler外的代码,但容器复用时可能导致连接失效、重复执行等问题。
  • 资源生命周期管理:数据库连接、游标等资源要在handler内创建,并在finally块中强制关闭,避免资源泄漏。
  • 敏感信息不硬编码:数据库用户名、密码、主机地址等敏感信息,通过Lambda的环境变量配置,代码中用os.environ.get("DB_USER")获取,提升安全性。
  • 异常处理与事务回滚:数据库操作失败时必须回滚事务,避免产生脏数据;同时返回明确的错误响应,便于调用方处理。
  • 返回规范响应:Lambda函数应返回包含statusCode、message的标准JSON格式响应,适配API Gateway等服务的集成要求。
  • 权限与网络配置:如果数据库在VPC内,需将Lambda配置到对应VPC的子网和安全组中,确保Lambda能访问数据库端口(默认3306);同时给Lambda配置对应的IAM权限。
  • 本地测试:通过if __name__ == "__main__"的方式在本地测试handler函数,模拟event参数验证逻辑,再部署到Lambda环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:01:20