【问题标题】:Winston Force flush before ending lambda executionWinston 在结束 lambda 执行之前强制刷新
【发布时间】:2021-11-10 21:06:05
【问题描述】:

我正在尝试使用 Winston 从 Aws Lambda 向 Datadog 发送日志。 lambda 的问题在于,一旦我们返回响应,lambda 执行就会停止,并且不会给 Winston 时间刷新日志。

有没有办法可以在返回之前强制刷新。我正在尝试这个,但它似乎没有成功:

async function handler (event): Promise<FormattedJSONResponse> {
    const logger = getLogger()
    // do some work
    await closeLogger(logger)
    return awsResponse
}

function closeLogger (logger: Logger): Promise<any> {
  const loggerDone = new Promise((resolve, _) => {
    logger.on('finish', () => {
      resolve(logger)
    })
  })

  logger.end()
  logger.close()
  return loggerDone
}

版本:

  • AWS Lambda 与 nodejs 12
  • 温斯顿:3.3.3

感谢您的帮助

【问题讨论】:

    标签: aws-lambda winston


    【解决方案1】:

    首先,我不明白您为什么要在 lambda 函数中发送日志?如果您这样做,您的 lambda 函数将运行更长时间来处理日志,这意味着您需要为将日志发送到 Datadog 所需的时间付费。

    相反,您可以将日志保存到 CloudWatch。为避免对 CloudWatch 收取高额费用,请将保留时间设置为相当短的时间,可能是一天。然后,您可以在 CloudWatch 日志流中添加一个订阅者,该订阅者可能是另一个 lambda 函数。这个“日志处理器”-lambda 函数将处理、转换日志并将它们发送到 Datadog。使用这种架构,如果无法访问 Datadog,您的第一个包含业务逻辑的 lambda 函数将不会失败。它使您的架构更具弹性,并具有更好的关注点分离。崔彦在"Centralised logging for AWS Lambda"写了一篇很棒的文章

    另一种方法,在某种程度上仍然将您的日志记录与您的 lambda 函数业务逻辑分开,建立在 lambda extensionsLambda Logs API 之上。

    简单地说,lambda 扩展为您的函数添加了一个额外的层,但不是 lambda 函数代码本身的一部分。可能对你来说最好的部分:Datadog already offers a ready to use extension,负责:

    • 将实时增强的 Lambda 指标、自定义指标和跟踪从 Datadog Lambda 库推送到 Datadog。
    • 将日志从您的 Lambda 函数转发到 Datadog。

    有关 Lambda 扩展的更多信息,请点击上述链接或查看 Yan Cui 的帖子"Lambda Logs API: a new way to process Lambda logs in real-time"

    【讨论】:

    • 我尝试使用 Datadog lambda 扩展,但问题仍然存在。并非所有日志都到达 Datadog 服务。可以肯定的一件事是它们出现在云手表中。现在我使用的是普通的 console.log()。
    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2021-10-10
    • 2018-09-11
    • 2021-05-13
    • 2014-02-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多