【问题标题】:Lambda AWS instant return logsLambda AWS 即时返回日志
【发布时间】:2020-10-04 05:59:02
【问题描述】:

我想直接快速访问 AWS lambda 中的日志。

我可以查询 CloudWatch,但获取数据需要时间。

是否可以在 Lambda 中获取所有执行日志并返回此数据作为响应?


2020 年 6 月 15 日更新

感谢@John 的回答,我在这里提供更多信息:

我在 .NET 中为 lambda 使用专用记录器

https://github.com/aws/aws-lambda-dotnet/tree/master/Libraries/src/Amazon.Lambda.Logging.AspNetCore

如果出现任何问题,我的应用需要记录日志以进行调试。

例如,您要访问什么类型的“日志”

我只在 lambda 函数中以不同的日志记录级别记录一些数据,例如:

  1. logger.LogDebug("Lambda 已启动");
  2. logger.LogCritical(异常);
  3. logger.LogInfo(businessDataForDebug);

我想获取所有记录的语句,这些语句通过日志记录级别传递,并尽快在 lambda 响应中返回所有这些信息。 日志数据必须引用特定的 lambda 执行。 否则,它将无用。

您要从 CloudWatch 寻找什么类型的数据?

如果发生,我主要需要记录字符串消息和异常。如果可能的话,最好包括特定日志调用的时间。此外,一些“日志”ID 可以作为参考 - 有类似 RequestId 的东西。

目前我可以在 CloudWatch 中获取所有这些日志进行查询,但这需要时间而且速度太慢。我进行 API 调用:StartQueryAsync,然后是 GetQueryResultsAsync。解决方案应该尽可能快。我可以制作丑陋的自定义记录器,在那里我可以收集所有日志到 ex。列出 myLogs 并简单地以 JSON 的形式返回,但我希望有很好的 AWS 解决方案来解决这个问题。

“执行日志”是什么意思?

我指的是 Lambda 简单函数运行时中 logger 生成的所有日志。

LambdaFunction(request, context){
InitializeLoggerWithLogLevel(debug);
logger.LogInfo("Log Info"); //Not logged due to min log level Debug
logger.LogTrace("Log Trace"); //Logged, trace > debug
logger.LogDebug("Log debug"); //Logged, debug == debug

您指的是存储在 Amazon CloudWatch Logs 中的 AWS Lambda 函数的输出吗?

是的,我可以从那里查询日志,但需要几秒钟才能得到它。我会更快地获取数据。

我可以相信 AWS 不提供这样的解决方案。解决方法可能是通过 ex 将获取日志委托给另一个 lambda。 SQS 或将执行的特定 lambda 函数的日志移动到 S3 存储桶,然后提供用户链接以供下载。我的第一个主要 lambda 必须很快,可以处理许多请求,例如机关枪;)。

请告诉我最好的方法。我愿意进一步讨论。

问候,

【问题讨论】:

  • 请编辑您的问题以提供更多信息。例如,您想要访问什么类型的“日志”,它们存储在哪里以及它们包含什么信息?您要从 CloudWatch 寻求什么类型的数据? “执行日志”是什么意思?您指的是存储在 Amazon CloudWatch Logs 中的 AWS Lambda 函数的输出吗?请编辑您的问题以提供此附加信息,而不是通过评论来回答。
  • 您好约翰,谢谢您的回答。我添加了更新。

标签: .net logging aws-lambda amazon-cloudwatch


【解决方案1】:

如果您每秒达到 50 个事务,CloudWatch 事务就会受到限制。您可以要求增加此限制:https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-cloudwatch-logs

参考:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html

如果可能的话,最好包含特定日志调用的时间。此外,一些“日志”ID 可以作为参考 - 有类似 RequestId 的东西。 目前我可以在 CloudWatch 中获取所有这些日志进行查询,但这需要时间而且速度太慢。

如果您寻求 FAST 解决方案并且您确实在突破 CloudWatch 限制,请使用 DynamoDB。

【讨论】:

  • 您好 Jeremy,感谢您的回答和努力。限制值得考虑,甚至可能使用 DynamoDb。我的问题更普遍,我正在寻找在我的场景中检索我生成的 ASAP 日志的最佳方法。
  • @Cenarius 我不是在开玩笑,游戏服务和 Kinesis 很贵。你有预算吗? Amazing.com 购物车使用 DynamoDB 运行。 500,000 名客户同时在线。在需要引入 DAX 或弹性缓存服务之前,您可以轻松使用它
【解决方案2】:

您可以将 CloudWatch 日志流式传输给自己而不是获取它们。

您可以将 Lambda 函数订阅到 CloudWatch Log Events。这样您就可以实时处理它。

使用这种方法,您可以将其流式传输到 ElasticSearch 实例,以便于查询和处理。

您还可以让 Lambda 将这些事件写入 S3 存储桶。

参考:https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html

【讨论】:

    【解决方案3】:

    新的aws lambda extensionlogs API 可能是可能的 这个想法是让扩展程序请求日志 api 来获取日志,而不是使用 ipc 将日志发送到 lambda 函数(没有设法使其工作)或简单地使用 /tmp 文件夹通过扩展程序写入日志和然后从函数中读取它。

    我试图做一个 POC 来为一个副项目返回日志,但没能成功。 扩展有自己的生命周期,通常在 lambda 关闭后接收日志。

    有时我在多次运行函数时会收到日志,可能日志来自之前的执行。

    我认为可行的解决方案是将日志存储到 s3 存储桶中,并通过 s3 上传事件触发另一个 lambda,该事件将返回日志。与仅订阅需要更多时间的云手表相比,这可能是一个可靠的解决方案,具体取决于需求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 2023-01-18
      • 2017-09-07
      • 2016-11-27
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多