AWS Lambda即时返回日志

6
我希望能够直接快速地访问 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

我的应用程序需要记录日志以调试出现的任何问题。
例如,您想要访问什么类型的“日志”?
我在不同的日志级别上仅记录一些数据,例如:
1. logger.LogDebug("Lambda started"); 2. logger.LogCritical(exceptions); 3. logger.LogInfo(businessDataForDebug);
我想要获取所有已通过日志级别传递的记录语句,并尽快将所有信息作为 Lambda 响应返回。日志数据必须指向特定的 Lambda 执行。否则,它将是无用的。
你从 CloudWatch 中寻找什么类型的数据?
我主要需要记录的字符串消息和异常(如果发生)。如果可能的话,包括特定日志调用的时间会很好。此外,一些“日志” ID 作为参考将会很好 - 有类似于 RequestId 的东西。
现在我可以通过在CloudWatch中进行查询来获取所有这些日志,但这需要时间,并且速度太慢了。我使用API调用:StartQueryAsync然后GetQueryResultsAsync。解决方案应尽可能快。我可以创建丑陋的自定义记录器,在其中可以将所有日志收集到List myLogs中,然后简单地作为JSON在响应中返回,但我希望有很好的AWS解决方案来实现此目的。
“执行日志”是什么意思?
我指的是Lambda简单函数运行时生成的所有日志。
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日志中的AWS Lambda函数输出吗?

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

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

请为我建议最佳方法。我愿意进一步讨论。

敬礼,


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

3
如果您的每秒事务数达到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中进行查询以获取所有这些日志,但需要时间并且速度太慢。

如果您想要快速解决方案,并且确实正在推动CloudWatch限制,请使用DynamoDB。

嗨,Jeremy, 感谢您的回答和努力。限制值得考虑,甚至可以使用DynamoDb。 我的问题更加普遍,我正在寻找在我的情况下检索我生成的日志的最佳方法。 - Cenarius
@Cenarius 我不是在开玩笑,游戏服务和Kinesis都很昂贵。你有预算吗?Amazing.com购物车使用DynamoDB运行,最多可同时在线50万客户。在你需要引入DAX或弹性缓存服务之前,你可以轻松使用它。 - Jeremy Thompson

0

通过新的aws lambda extensionlogs API,这可能是可行的。 这个想法是让扩展请求日志API获取日志,然后使用IPC将日志发送到Lambda函数(无法使其工作),或者仅使用/tmp文件夹通过扩展编写日志,然后从函数中读取。

我尝试做一个POC来返回一个副项目的日志,但没有成功。 该扩展具有自己的生命周期,并且通常在Lambda关闭后接收日志。

有时候我会在运行函数多次时收到日志,也许这些日志来自先前的执行。

我认为可以解决的一个解决方案是将日志存储到S3存储桶中,并通过S3上传事件触发另一个Lambda返回日志。根据要求,与仅订阅云监视相比,这可能是一个可靠的解决方案,后者需要更长的时间。


0

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

您可以订阅Lambda函数到CloudWatch日志事件。这样,您可以实时处理它。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接