Go Lambda 函数日志记录和监控 - AWS Lambda

Go Lambda 函数日志记录和监控

AWS Lambda 将代表您自动监控 Lambda 函数并将日志记录发送至 Amazon CloudWatch。您的 Lambda 函数带有一个 CloudWatch Logs 日志组以及函数的每个实例的日志流。Lambda 运行时环境会将每个调用的详细信息发送到日志流,然后中继函数代码的日志和其他输出。有关更多信息,请参阅 将 CloudWatch Logs 与 Lambda 结合使用

本页旨在介绍如何从 Lambda 函数的代码生成日志输出,并使用 AWS Command Line Interface、Lambda 控制台或 CloudWatch 控制台访问日志。

创建返回日志的函数

您可以使用 fmt 程序包中的方法或写入到 stdoutstderr 的任何日志记录库,从函数代码输出日志。以下示例使用日志包

main.go – 日志记录
func handleRequest(ctx context.Context, event events.SQSEvent) (string, error) { // event eventJson, _ := json.MarshalIndent(event, "", " ") log.Printf("EVENT: %s", eventJson) // environment variables log.Printf("REGION: %s", os.Getenv("AWS_REGION")) log.Println("ALL ENV VARS:") for _, element := range os.Environ() { log.Println(element) }
例 日志格式
START RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 Version: $LATEST 2020/03/27 03:40:05 EVENT: { "Records": [ { "messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "receiptHandle": "MessageReceiptHandle", "body": "Hello from SQS!", "md5OfBody": "7b27xmplb47ff90a553787216d55d91d", "md5OfMessageAttributes": "", "attributes": { "ApproximateFirstReceiveTimestamp": "1523232000001", "ApproximateReceiveCount": "1", "SenderId": "123456789012", "SentTimestamp": "1523232000000" }, ... 2020/03/27 03:40:05 AWS_LAMBDA_LOG_STREAM_NAME=2020/03/27/[$LATEST]569cxmplc3c34c7489e6a97ad08b4419 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_NAME=blank-go-function-9DV3XMPL6XBC 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_MEMORY_SIZE=128 2020/03/27 03:40:05 AWS_LAMBDA_FUNCTION_VERSION=$LATEST 2020/03/27 03:40:05 AWS_EXECUTION_ENV=AWS_Lambda_go1.x END RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 REPORT RequestId: dbda340c-xmpl-4031-8810-11bb609b4c71 Duration: 38.66 ms Billed Duration: 39 ms Memory Size: 128 MB Max Memory Used: 54 MB Init Duration: 203.69 ms XRAY TraceId: 1-5e7d7595-212fxmpl9ee07c4884191322 SegmentId: 42ffxmpl0645f474 Sampled: true

Go 运行时记录每次调用的 STARTENDREPORT 行。报告行提供了以下详细信息:

REPORT 行数据字段
  • RequestId – 调用的唯一请求 ID。

  • Duration(持续时间)– 函数的处理程序方法处理事件所花费的时间。

  • Billed Duration(计费持续时间)– 针对调用计费的时间量。

  • Memory Size(内存大小)– 分配给函数的内存量。

  • Max Memory Used(最大内存使用量)– 函数使用的内存量。如果调用共享执行环境,Lambda 会报告所有调用使用的最大内存。此行为可能会导致报告值高于预期。

  • Init Duration(初始持续时间)– 对于提供的第一个请求,为运行时在处理程序方法外部加载函数和运行代码所花费的时间。

  • XRAY TraceId – 对于追踪的请求,为 AWS X-Ray 追踪 ID

  • SegmentId – 对于追踪的请求,为 X-Ray 分段 ID。

  • Sampled(采样)– 对于追踪的请求,为采样结果。

在 Lambda 控制台中查看日志

调用 Lambda 函数后,您可以使用 Lambda 控制台查看日志输出。

如果可以在嵌入式代码编辑器中测试代码,则可以在执行结果中找到日志。使用控制台测试功能调用函数时,可以在详细信息部分找到日志输出

在 CloudWatch 控制台中查看日志

您可以使用 Amazon CloudWatch 控制台查看所有 Lambda 函数调用的日志。

使用 CloudWatch 控制台查看日志
  1. 打开 CloudWatch 控制台的 Log groups(日志组页面)。

  2. 选择您的函数 (/aws/lambda/your-function-name) 的日志组。

  3. 创建日志流。

每个日志流对应一个函数实例。日志流会在您更新 Lambda 函数以及创建更多实例来处理多个并发调用时显示。要查找特定调用的日志,建议您使用 AWS X-Ray 检测函数。X-Ray 会在追踪中记录有关请求和日志流的详细信息。

使用 AWS Command Line Interface(AWS CLI)查看日志

AWS CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 AWS 服务进行交互。要完成本节中的步骤,您必须拥有 AWS CLI 版本 2

您可以通过 AWS CLI,使用 --log-type 命令选项检索调用的日志。响应包含一个 LogResult 字段,其中包含多达 4KB 来自调用的 base64 编码日志。

例 检索日志 ID

以下示例说明如何从 LogResult 字段中检索名为 my-function 的函数的日志 ID

aws lambda invoke --function-name my-function out --log-type Tail

您应看到以下输出:

{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
例 解码日志

在同一命令提示符下,使用 base64 实用程序解码日志。以下示例说明如何为 my-function 检索 base64 编码的日志。

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode

如果使用 cli-binary-format 版本 2,则 AWS CLI 选项是必需的。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out。有关更多信息,请参阅版本 2 的 AWS Command Line Interface 用户指南中的 AWS CLI 支持的全局命令行选项

您应看到以下输出:

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 Windows 上可用。macOS 用户可能需要使用 base64 -D

例 get-logs.sh 脚本

在同一命令提示符下,使用以下脚本下载最后五个日志事件。此脚本使用 sed 从输出文件中删除引号,并休眠 15 秒以等待日志可用。输出包括来自 Lambda 的响应,以及来自 get-log-events 命令的输出。

复制以下代码示例的内容并将其作为 get-logs.sh 保存在 Lambda 项目目录中。

如果使用 cli-binary-format 版本 2,则 AWS CLI 选项是必需的。要将其设为默认设置,请运行 aws configure set cli-binary-format raw-in-base64-out。有关更多信息,请参阅版本 2 的 AWS Command Line Interface 用户指南中的 AWS CLI 支持的全局命令行选项

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --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 stream1 --limit 5
例 macOS 和 Linux(仅限)

在同一命令提示符下,macOS 和 Linux 用户可能需要运行以下命令以确保脚本可执行。

chmod -R 755 get-logs.sh
例 检索最后五个日志事件

在同一命令提示符下,运行以下脚本以获取最后五个日志事件。

./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" }

删除日志

删除函数时,日志组不会自动删除。要避免无限期存储日志,请删除日志组,或配置一个保留期,在该保留期之后,日志将自动删除。