Lambda会自动捕捉运行时的日志,并将其导向Amazon CloudWatch。这个日志流包含了你的函数代码和扩展产生的日志,也包含了Lambda作为函数调用的一部分而产生的日志。
Lambda扩展可以使用Lambda Runtime Logs API,直接从Lambda执行环境中订阅日志流。Lambda将日志流传给扩展,然后扩展可以对日志进行处理、过滤,并将其发送到任何首选目的地。
Logs API允许扩展程序订阅三种不同的日志流:
Lambda函数产生的函数日志,并写入stdout或stderr。
扩展代码产生的扩展日志。
Lambda平台日志,记录与调用和扩展相关的事件和错误。
订阅接收日志
Lambda扩展可以通过向Logs API发送订阅请求来订阅接收日志。
要订阅接收日志,你需要扩展标识符(Lambda-Extension-Identifier)。首先注册扩展以接收扩展标识符。然后在初始化阶段订阅Logs API。初始化阶段完成后,Lambda不会处理订阅请求。
内存使用情况
随着订阅者数量的增加,内存用量也会线性增加。订阅会消耗内存资源,因为每个订阅会打开一个新的内存缓冲区来存储日志。为了帮助优化内存使用,你可以调整缓冲区的配置。缓冲区的内存使用量计入执行环境中的总内存消耗。
目的地协议
你可以选择以下协议之一来接收日志。
1.HTTP(推荐)—Lambda将日志以JSON格式的记录数组形式交付给本地HTTP端点(http://sandbox.localdomain:
P
O
R
T
/
{PORT}/
PORT/{PATH})。$PATH参数是可选的。注意,只支持HTTP,不支持HTTPS。你可以选择通过PUT或POST接收日志。
2.TCP - Lambda将日志以换行划线的JSON(NDJSON)格式发送到TCP端口。
我们建议使用HTTP而不是TCP。使用TCP,Lambda平台无法确认它何时向应用层交付日志。因此,如果你的扩展崩溃,你可能会丢失日志。HTTP则没有这个限制。
我们还建议在订阅接收日志之前设置本地HTTP监听器或TCP端口。在设置过程中,请注意以下几点。
Lambda只向执行环境中的目的地发送日志。
如果没有听众,或者POST或PUT请求出现错误,Lambda会重试发送日志的尝试(有后退)。如果日志订阅者崩溃了,在Lambda重启执行环境后,它还会继续接收日志。
Lambda保留了9001端口。没有其他端口号的限制或建议。
缓冲配置
Lambda可以对日志进行缓冲,并将其交付给订阅者。你可以在订阅请求中通过指定以下可选字段来配置这种行为。请注意,Lambda对你没有指定的任何字段使用默认值。
timeoutMs - 缓冲一个批次的最大时间(以毫秒计)。默认值:1,000。最小值。25. 最大。30,000.
maxBytes - 在内存中缓冲的日志的最大尺寸(字节)。默认值: 262,144。最小值。262,144. 最大。1,048,576.
maxItems - 缓冲在内存中的事件的最大数量。默认:10,000。最小值。1,000. 最大。10,000.
在缓冲配置期间,请注意以下几点:
如果任何输入流被关闭,例如运行时崩溃,Lambda就会刷新日志。
每个订阅者可以在他们的订阅请求中指定不同的缓冲配置。
考虑到你在读取数据时需要的缓冲区大小。期望收到2*maxBytes+metadata那么大的有效载荷,其中maxBytes是在订阅请求中配置的。例如,Lambda将以下元数据字节添加到每个记录中。
举个例子:
{
"time": "2020-08-20T12:31:32.123Z",
"type": "function",
"record": "Hello World"
}
如果订阅者不能足够快地处理传入的日志,Lambda可能会丢弃日志以保持内存的利用率。为了表明被丢弃的记录数量,Lambda会发送一个platform.logsDropped日志。
订阅实例
下面的例子显示了一个订阅平台和功能日志的请求。
PUT http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs/ HTTP/1.1
{ "schemaVersion": "2020-08-15",
"types": [
"platform",
"function"
],
"buffering": {
"maxItems": 1000,
"maxBytes": 262144,
"timeoutMs": 100
},
"destination": {
"protocol": "HTTP",
"URI": "http://sandbox.localdomain:8080/lambda_logs"
}
}
如果请求成功,用户会收到一个HTTP 200成功响应。
HTTP/1.1 200 OK
"OK"
Logs API的示例代码
有关显示如何将日志发送到自定义目的地的示例代码,请参阅AWS计算博客上的使用AWS Lambda扩展将日志发送到自定义目的地。
有关显示如何开发基本Lambda扩展并订阅日志API的Python和Go代码示例,请参见AWS Samples GitHub仓库中的AWS Lambda扩展。有关构建Lambda扩展的更多信息,请参阅Lambda扩展API。
Logs API参考
你可以从AWS_LAMBDA_RUNTIME_API环境变量中检索到Logs API端点。要发送一个API请求,请在API路径前使用前缀2020-08-15/。比如说:
http://${AWS_LAMBDA_RUNTIME_API}/2020-08-15/logs/
订阅
要订阅Lambda执行环境中可用的一个或多个日志流,扩展程序发送一个订阅API请求。
路径 - /logs
方法 - PUT
主体参数
destination - 见目的地协议。要求:是。类型: 字符串。
buffering - 见缓冲配置。需要:不需要。类型: 字符串。
types - 要接收的日志类型的一个数组。需要:是。类型: 字符串的数组。有效值。“平台”, “功能”, “扩展”。
schemaVersion - 需要:不需要。默认值。“2020-08-15”. 设置为 “2021-03-18",扩展才能接收platform.runtimeDone消息。
响应参数:
2020-08-15版的订阅响应的OpenAPI规范可用于HTTP和TCP协议。
HTTP: logs-api-http-response.zip
TCP:logs-api-tcp-response.zip
响应代码
200 - 请求成功完成
202 - 请求被接受。在本地测试期间对订阅请求的响应。
4XX - 错误的请求
500 - 服务错误
如果请求成功,用户会收到一个HTTP 200成功响应。
HTTP/1.1 200 OK
"OK"
如果请求失败,用户会收到一个错误响应。比如说:
HTTP/1.1 400 OK
{
"errorType": "Logs.ValidationError",
"errorMessage": URI port is not provided; types should not be empty"
}
日志信息
Logs API允许扩展订阅三种不同的日志流。
函数 - Lambda函数产生的日志,并写入stdout或stderr。
扩展 - 扩展代码产生的日志。
平台 - 运行时平台产生的日志,记录与调用和扩展相关的事件和错误。
函数 logs
Lambda函数和内部扩展生成函数日志,并将其写入stdout或stderr。
下面的例子显示了一个函数日志信息的格式。{ “time”: “2020-08-20T12:31:32.123Z”, “type”: “函数”, “记录”: “遇到了ERROR。堆栈跟踪:\n\my-function (line 10)\n” }
扩展 logs
扩展可以生成扩展日志。日志的格式与函数日志的格式相同。
平台 logs
Lambda为平台事件(如platform.start、platform.end和platform.fault)生成日志消息。
你可以选择订阅2021-03-18版本的Logs API模式,其中包括platform.runtimeDone日志消息。
平台日志信息示例
下面的例子显示了平台开始和平台结束的日志。这些日志表明 requestId 指定的调用的调用开始时间和调用结束时间。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.start",
"record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56"}
}
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.end",
"record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56"}
}
平台报告日志包括关于 requestId 指定的调用的指标。只有当调用包括冷启动时,initDurationMs字段才会包括在日志中。如果AWS X-Ray追踪处于活动状态,则日志包括X-Ray元数据。下面的例子显示了一个包括冷启动的调用的平台报告日志。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.report",
"record": {"requestId": "6f7f0961f83442118a7af6fe80b88d56",
"metrics": {"durationMs": 101.51,
"billedDurationMs": 300,
"memorySizeMB": 512,
"maxMemoryUsedMB": 33,
"initDurationMs": 116.67
}
}
}
平台故障日志捕捉到运行时或执行环境的错误。下面的例子显示了一个平台故障日志信息。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.fault",
"record": "RequestId: d783b35e-a91d-4251-af17-035953428a2c Process exited before completing request"
}
当一个扩展在扩展API上注册时,Lambda会生成一个平台扩展日志。下面的例子显示了一个平台扩展信息。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.extension",
"record": {"name": "Foo.bar",
"state": "Ready",
"events": ["INVOKE", "SHUTDOWN"]
}
}
当一个扩展订阅了logs API时,Lambda会生成一个平台logs订阅日志。下面的例子显示了一条日志订阅信息。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.logsSubscription",
"record": {"name": "Foo.bar",
"state": "Subscribed",
"types": ["function", "platform"],
}
}
当一个扩展无法处理它所接收的日志数量时,Lambda会生成一个platform logs dropped日志。下面的例子显示了一个platform.logsDropped的日志信息。
{
"time": "2020-08-20T12:31:32.123Z",
"type": "platform.logsDropped",
"record": {"reason": "Consumer seems to have fallen behind as it has not acknowledged receipt of logs.",
"droppedRecords": 123,
"droppedBytes" 12345
}
}
平台上的运行时间Done信息
如果你在订阅请求中设置模式版本为 “2021-03-18”,Lambda会在函数调用成功或出错后发送一个platform.runtimeDone消息。扩展可以使用此消息来停止此函数调用的所有遥测收集。
2021-03-18模式版本中的Log事件类型的OpenAPI规范可在此获得:schema-2021-03-18.zip
当运行时发送Next或Error运行时API请求时,Lambda会生成platform.runtimeDone日志消息。platform.runtimeDone日志通知Logs API的消费者,函数调用已经完成。扩展可以使用此信息来决定何时发送该调用期间收集的所有遥测数据。
成功信息示例:
{
"time": "2021-02-04T20:00:05.123Z",
"type": "platform.runtimeDone",
"record": {
"requestId":"6f7f0961f83442118a7af6fe80b88",
"status": "success"
}
}
失败信息示例:
{
"time": "2021-02-04T20:00:05.123Z",
"type": "platform.runtimeDone",
"record": {
"requestId":"6f7f0961f83442118a7af6fe80b88",
"status": "failure"
}
}
超时信息示例:
{
"time": "2021-02-04T20:00:05.123Z",
"type": "platform.runtimeDone",
"record": {
"requestId":"6f7f0961f83442118a7af6fe80b88",
"status": "timeout"
}
}