Ruby 中的 AWS Lambda 函数日志记录
您的 Lambda 函数带有一个 CloudWatch Logs 日志组,其中包含您的函数的每个实例的日志流。运行时会将每个调用的详细信息发送到该日志流,然后中继日志和来自您的函数代码的其他输出。
要从函数代码输出日志,您可以使用 puts
语句或使用写入到 stdout
或 stderr
的任何日志记录库。以下示例记录环境变量和事件对象的值。
例 lambda_function.rb
# lambda_function.rb def handler(event:, context:) puts "## ENVIRONMENT VARIABLES" puts ENV.to_a puts "## EVENT" puts event.to_a end
有关更详细的日志,请使用记录器库
# lambda_function.rb require 'logger' def handler(event:, context:) logger = Logger.new($stdout) logger.info('## ENVIRONMENT VARIABLES') logger.info(ENV.to_a) logger.info('## EVENT') logger.info(event) event.to_a end
来自 logger
的输出包括时间戳、进程 ID、日志级别和请求 ID。
I, [2019-10-26T10:04:01.689856 #8] INFO 6573a3a0-2fb1-4e78-a582-2c769282e0bd -- : ## EVENT I, [2019-10-26T10:04:01.689874 #8] INFO 6573a3a0-2fb1-4e78-a582-2c769282e0bd -- : {"key1"=>"value1", "key2"=>"value2", "key3"=>"value3"}
当您在函数配置页上测试函数时,Lambda 控制台会显示日志输出。要查看所有调用的日志,请使用 CloudWatch Logs 控制台。
查看 Lambda 函数的日志
-
选择您的函数 (/aws/lambda/
function-name
) 的日志组。 -
选择列表中的第一个流。
每个日志流对应一个函数实例。当您更新函数以及创建更多实例以处理多个并发调用时,会显示新的流。要找到特定调用的日志,您可以使用 X-Ray 分析您的函数并在跟踪中记录有关请求和日志流的详细信息。如需将日志和跟踪与 X-Ray 相关联的示例应用程序,请参阅AWS Lambda 错误处理器示例应用程序。
要从命令行获取调用的日志,请使用 --log-type
选项。响应包含一个 LogResult
字段,该字段包含来自调用的多达 4 KB 的 base64 编码日志。
$
aws lambda invoke --function-name my-function out --log-type Tail
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
您可以使用 base64
实用程序来解码日志。
$
aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB
base64
实用工具在 Linux、macOS 和 Ubuntu on Windowsbase64 -D
。
在删除函数时,不会自动删除日志组。为避免存储无限的日志,请删除日志组或者配置保留期,在该期限后会自动删除日志。
例 日志格式
START RequestId: 50aba555-99c8-4b21-8358-644ee996a05f Version: $LATEST ## ENVIRONMENT VARIABLES AWS_LAMBDA_FUNCTION_VERSION $LATEST AWS_LAMBDA_LOG_GROUP_NAME /aws/lambda/my-function AWS_LAMBDA_LOG_STREAM_NAME 2020/01/31/[$LATEST]3f34xmpl069f4018b4a773bcfe8ed3f9 AWS_EXECUTION_ENV AWS_Lambda_ruby2.5 ... ## EVENT key value END RequestId: 50aba555-xmpl-4b21-8358-644ee996a05f REPORT RequestId: 50aba555-xmpl-4b21-8358-644ee996a05f Duration: 12.96 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 48 MB Init Duration: 117.86 ms XRAY TraceId: 1-5e34a246-2a04xmpl0fa44eb60ea08c5f SegmentId: 454xmpl46ca1c7d3 Sampled: true
Ruby 运行时记录每次调用的 START
、END
和 REPORT
行。报告行提供了以下详细信息。
报告日志
-
RequestId – 调用的唯一请求 ID。
-
Duration (持续时间) – 函数的处理程序方法处理事件所花费的时间。
-
Billed Duration (计费持续时间) – 针对调用计费的时间量。
-
Memory Size (内存大小) – 分配给函数的内存量。
-
Max Memory Used (最大内存使用量) – 函数使用的内存量。
-
Init Duration (初始持续时间) – 对于提供的第一个请求,为运行时在处理程序方法外部加载函数和运行代码所花费的时间。
-
XRAY TraceId – 对于跟踪的请求,为 AWS X-Ray 跟踪 ID。
-
SegmentId – 对于跟踪的请求,为 X-Ray 分段 ID。
-
Sampled (采样) – 对于跟踪的请求,为采样结果。
您可以在 Lambda 控制台中、在 CloudWatch Logs 控制台中或从命令行查看日志。
在 AWS 管理控制台中查看日志
当您在函数配置页上测试函数时,Lambda 控制台会显示日志输出。要查看所有调用的日志,请使用 CloudWatch Logs 控制台。
查看 Lambda 函数的日志
-
选择您的函数 (/aws/lambda/
function-name
) 的日志组。 -
选择列表中的第一个流。
每个日志流对应一个函数实例。当您更新函数以及创建更多实例以处理多个并发调用时,会显示新的流。要找到特定调用的日志,您可以使用 X-Ray 分析您的函数并在跟踪中记录有关请求和日志流的详细信息。如需将日志和跟踪与 X-Ray 相关联的示例应用程序,请参阅AWS Lambda 错误处理器示例应用程序。
使用 AWS CLI
要从命令行获取调用的日志,请使用 --log-type
选项。响应包含一个 LogResult
字段,该字段包含来自调用的多达 4 KB 的 base64 编码日志。
$
aws lambda invoke --function-name my-function out --log-type Tail
{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }
您可以使用 base64
实用程序来解码日志。
$
aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB
base64
实用工具在 Linux、macOS 和 Ubuntu on Windowsbase64 -D
。
要从命令行获取完整的日志事件,您可以在函数输出中包含日志流名称,如上例中所示。以下示例脚本调用名为 my-function
的函数并下载最后 5 个日志事件。
例 get-logs.sh 脚本
此示例要求 my-function
返回日志流 ID。
#!/bin/bash aws lambda invoke --function-name my-function --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5
此脚本使用 sed
从输出文件中删除引号,并休眠 15 秒以等待日志可用。输出包括来自 Lambda 的响应,以及来自 get-log-events
命令的输出。
$
./get-logs.sh
{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }
删除日志
在删除函数时,不会自动删除日志组。为避免存储无限的日志,请删除日志组或者配置保留期,在该期限后会自动删除日志。