我正在为AWS Lambda编写NodeJS / Typescript目标中的记录器服务,我注意到有四种方法可以完成Lambda函数:
默认终止。所有回调都已完成,Lambda将完成执行。
错误。有未被捕获的异常或未处理的拒绝,它会导致Lambda崩溃并调用process.exit()
。
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完成执行之前刷新日志,任何关于如何操作的想法?感谢。
答案 0 :(得分:3)
超时由lambda容器处理。目前没有信号或回调,因此对于这种情况,最好的办法是将计时器设置为在超时值之前过期,以刷新日志并自行停止lambda。
对于受控终止案例,您可以修补context.done
,context.succeed
和context.fail
:
const { done, succeed, fail } = context;
context.done = (...params) => {
logErrorAndFlushLogs();
done(...params);
};
context.succeed = (...params) => {
logErrorAndFlushLogs();
succeed(...params);
};
context.fail = (...params) => {
logErrorAndFlushLogs();
fail(...params);
};