【问题标题】:Flush logs before Lambda finish executing在 Lambda 完成执行之前刷新日志
【发布时间】:2018-09-16 21:10:20
【问题描述】:

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

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

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

  3. 超时。 Lambda 的运行时间超过了开发人员指定的时间。
  4. 受控终止。 Lambda 通过调用context.done()context.succeed()context.fail() 完成执行。不再推荐这个,应该改用callback()

无论 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();
    });
    

但是对于“超时”和“受控终止”,上面的函数都不起作用,我找不到在 Lambda 完成执行之前捕获它并刷新日志的方法,关于如何做到这一点的任何想法?谢谢。

【问题讨论】:

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


    【解决方案1】:

    超时由 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);
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 1970-01-01
      • 2019-02-22
      • 2021-07-23
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多