【发布时间】:2018-09-16 21:10:20
【问题描述】:
我正在为 AWS Lambda 编写 NodeJS/Typescript 中的记录器服务,我注意到有四种方法可以完成 Lambda 功能:
默认终止。所有回调都已完成,Lambda 将完成执行。
错误。存在未捕获的异常或未处理的拒绝,导致 Lambda 崩溃并调用
process.exit()。- 超时。 Lambda 的运行时间超过了开发人员指定的时间。
- 受控终止。 Lambda 通过调用
context.done()、context.succeed()或context.fail()完成执行。不再推荐这个,应该改用callback()。
无论 Lambda 如何完成执行,我都希望我的记录器能够刷新所有日志,这是我用不同的终止方式实现的:
-
默认终止。我在调用回调函数之前包装了处理程序和回调函数以刷新日志,并且效果很好。
wrap(fn) { return () => { // Wrap the callback function let callbackFunc = arguments[arguments.length - 1]; let wrappedCallback = this.wrapCallback(callbackFunc); arguments[arguments.length - 1] = wrappedCallback; return fn.apply(this, arguments); }; } wrapCallback(fn) { return () => { logger.flush(); return fn.apply(this, arguments); }; -
错误。我添加了代码来捕获错误和 process.exit,它起作用了。
process.on('unhandledRejection', (reason, p) => { logErrorAndFlusgLogs(); }).on('uncaughtException', err => { logErrorAndFlusgLogs(); }).on('exit', (code) => { logErrorAndFlusgLogs(); });
但是对于“超时”和“受控终止”,上面的函数都不起作用,我找不到在 Lambda 完成执行之前捕获它并刷新日志的方法,关于如何做到这一点的任何想法?谢谢。
【问题讨论】:
标签: node.js amazon-web-services typescript logging aws-lambda