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

AWS CloudWatch未记录Node.js Lambda堆栈追踪问题求助

解决AWS Lambda CloudWatch不显示错误堆栈的问题

1. 修复异步代码的错误捕获逻辑

你的代码里同时混用了await和回调函数,这是错误被吞掉的核心原因之一。mysql的query方法如果传入回调,不会返回Promise,await无法起到异步等待的作用,错误会直接逃逸出try-catch范围。改成Promise风格调用:

// 替换原有的query调用方式
try {
  const results = await connection.query('INSERT INTO users SET ?', record);
  // 后续业务逻辑
} catch (err) {
  console.error('数据库操作错误:', err.stack);
}

如果使用的旧版mysql库不支持Promise,用util.promisify包装方法:

const util = require('util');
// 将query转换为Promise兼容版本
connection.query = util.promisify(connection.query);

// 正常使用await调用
try {
  const results = await connection.query('INSERT INTO users SET ?', record);
} catch (err) {
  console.error(err.stack);
}

2. 确保错误信息完整输出

直接console.error(err)在Lambda环境中可能不会完整打印堆栈信息,改为打印err.stack或者序列化错误的所有字段:

catch (err) {
  // 打印完整堆栈追踪
  console.error(err.stack);
  // 或序列化输出错误的全部属性
  console.error('错误详情:', JSON.stringify(err, Object.getOwnPropertyNames(err)));
}

3. 捕获全局未处理的异步错误

如果存在未被try-catch覆盖的异步错误,Lambda可能不会将其输出到CloudWatch。在Lambda入口代码顶部添加全局错误监听:

process.on('uncaughtException', (err) => {
  console.error('未捕获异常:', err.stack);
  // 可选:添加资源清理逻辑,比如关闭数据库连接
  process.exit(1);
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('未处理的Promise拒绝:', reason.stack);
  process.exit(1);
});

4. 验证Lambda执行角色权限

确保Lambda的执行角色拥有logs:CreateLogStream和logs:PutLogEvents权限——虽然你能看到info日志,但权限部分缺失也可能导致错误日志无法写入。

5. 手动测试错误输出

编写简单的测试代码验证CloudWatch的错误捕获能力:

exports.handler = async (event) => {
  console.info('测试info日志');
  throw new Error('手动触发测试错误');
};

部署后查看CloudWatch,如果能捕获到该错误的堆栈,说明之前的问题是业务代码中的错误未被正确捕获。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:10:41