在Lambda完成执行之前刷新日志

时间:2018-04-06 19:09:00

标签: node.js amazon-web-services typescript logging aws-lambda

我正在为AWS Lambda编写NodeJS / Typescript目标中的记录器服务,我注意到有四种方法可以完成Lambda函数:

  1. 默认终止。所有回调都已完成,Lambda将完成执行。

  2. 错误。有未被捕获的异常或未处理的拒绝,它会导致Lambda崩溃并调用process.exit()

  3. 超时。 Lambda的运行时间超过了开发人员指定的时间。
  4. 受控终止。 Lambda通过调用context.done()context.succeed()context.fail()来执行。我们不再建议这样做,而应使用callback()代替。
  5. 我希望我的记录器能够刷新所有日志,无论Lambda如何执行,这是我用不同的终止方式实现的:

    1. 默认终止。

      ,我在调用回调函数之前包装了处理程序和回调函数来刷新日志
      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);
          };
      
    2. 错误。我添加了代码以捕获错误和process.exit,并且它有效。

      process.on('unhandledRejection', (reason, p) => {
          logErrorAndFlusgLogs();
      }).on('uncaughtException', err => {
          logErrorAndFlusgLogs();
      }).on('exit', (code) => {
          logErrorAndFlusgLogs();
      });
      
    3. 但是对于超时'并且'受控终止',上面没有任何功能工作,我无法找到一种方法来捕获它并在Lambda完成执行之前刷新日志,任何关于如何操作的想法?感谢。

1 个答案:

答案 0 :(得分:3)

超时由lambda容器处理。目前没有信号或回调,因此对于这种情况,最好的办法是将计时器设置为在超时值之前过期,以刷新日志并自行停止lambda。

对于受控终止案例,您可以修补context.donecontext.succeedcontext.fail

const { done, succeed, fail } = context;

context.done = (...params) => {
    logErrorAndFlushLogs();
    done(...params);
};

context.succeed = (...params) => {
    logErrorAndFlushLogs();
    succeed(...params);
};

context.fail = (...params) => {
    logErrorAndFlushLogs();
    fail(...params);
};