采用 C# 的 Lambda 函数日志记录
Amazon Lambda 将代表您自动监控 Lambda 函数并将函数指标发送至 Amazon CloudWatch。您的 Lambda 函数带有一个 CloudWatch Logs 日志组以及函数的每个实例的日志流。Lambda 运行时环境会将每个调用的详细信息发送到日志流,然后中继函数代码的日志和其他输出。
本页介绍如何从 Lambda 函数的代码生成日志输出,或使用 Amazon Command Line Interface、Lambda 控制台或 CloudWatch 控制台访问日志。
创建返回日志的函数
要从函数代码输出日志,您可以使用控制台类stdout
或 stderr
的任何日志记录库。以下示例使用来自 Amazon.Lambda.Core 库的 LambdaLogger
类。
例 src/blank-csharp/Function.cs
public async Task<AccountUsage> FunctionHandler(SQSEvent invocationEvent, ILambdaContext context) { GetAccountSettingsResponse accountSettings; try { accountSettings = await callLambda(); } catch (AmazonLambdaException ex) { throw ex; } AccountUsage accountUsage = accountSettings.AccountUsage; LambdaLogger.Log("ENVIRONMENT VARIABLES: " + JsonConvert.SerializeObject(System.Environment.GetEnvironmentVariables())); LambdaLogger.Log("CONTEXT: " + JsonConvert.SerializeObject(context)); LambdaLogger.Log("EVENT: " + JsonConvert.SerializeObject(invocationEvent)); return accountUsage; }
例 日志格式
START RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d Version: $LATEST ENVIRONMENT VARIABLES: { "AWS_EXECUTION_ENV": "AWS_Lambda_dotnetcore2.1", "AWS_LAMBDA_FUNCTION_MEMORY_SIZE": "256", "AWS_LAMBDA_LOG_GROUP_NAME": "/aws/lambda/blank-csharp-function-WU56XMPLV2XA", "AWS_LAMBDA_FUNCTION_VERSION": "$LATEST", "AWS_LAMBDA_LOG_STREAM_NAME": "2020/03/27/[$LATEST]5296xmpl084f411d9fb73b258393f30c", "AWS_LAMBDA_FUNCTION_NAME": "blank-csharp-function-WU56XMPLV2XA", ... EVENT: { "Records": [ { "MessageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78", "ReceiptHandle": "MessageReceiptHandle", "Body": "Hello from SQS!", "Md5OfBody": "7b270e59b47ff90a553787216d55d91d", "Md5OfMessageAttributes": null, "EventSourceArn": "arn:aws:sqs:us-west-2:123456789012:MyQueue", "EventSource": "aws:sqs", "AwsRegion": "us-west-2", "Attributes": { "ApproximateReceiveCount": "1", "SentTimestamp": "1523232000000", "SenderId": "123456789012", "ApproximateFirstReceiveTimestamp": "1523232000001" }, ... END RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d REPORT RequestId: d1cf0ccb-xmpl-46e6-950d-04c96c9b1c5d Duration: 4157.16 ms Billed Duration: 4200 ms Memory Size: 256 MB Max Memory Used: 99 MB Init Duration: 841.60 ms XRAY TraceId: 1-5e7e8131-7ff0xmpl32bfb31045d0a3bb SegmentId: 0152xmpl6016310f Sampled: true
.NET 运行时记录每次调用的 START
、END
和 REPORT
行。报告行提供了以下详细信息。
报告日志
-
RequestId – 调用的唯一请求 ID。
-
Duration(持续时间)– 函数的处理程序方法处理事件所花费的时间。
-
Billed Duration(计费持续时间)– 针对调用计费的时间量。
-
Memory Size(内存大小)– 分配给函数的内存量。
-
Max Memory Used(最大内存使用量)– 函数使用的内存量。
-
Init Duration(初始持续时间)– 对于提供的第一个请求,为运行时在处理程序方法外部加载函数和运行代码所花费的时间。
-
XRAY TraceId – 对于跟踪的请求,为 Amazon X-Ray 跟踪 ID。
-
SegmentId – 对于跟踪的请求,为 X-Ray 分段 ID。
-
Sampled(采样)– 对于跟踪的请求,为采样结果。
使用日志级别
从 .NET 6 开始,您可以为 Lambda 函数中的 其他日志记录使用日志级别 。日志级别可以为您的函数写入到 Amazon EventBridge (CloudWatch Events) 中的日志提供筛选和分类。
可用日志级别如下:
-
LogCritical
-
LogError
-
LogWarning
-
LogInformation
-
LogDebug
-
LogTrace
默认情况下,Lambda 将 LogInformation
级别日志及以上的日志写入到 CloudWatch。您可以使用 AWS_LAMBDA_HANDLER_LOG_LEVEL
环境变量调整 Lambda 编写的日志级别。将环境变量值设置为所需级别的字符串枚举值,如 LogLevel 枚举AWS_LAMBDA_HANDLER_LOG_LEVEL
设置为 Error
,则 Lambda 将会向 CloudWatch 中编写 LogError
和 LogCritical
消息。
Lambda 将 Console.WriteLine
调用编写为信息级消息,并将 Console.Error.WriteLine
调用编写为错误级消息。
如果您更喜欢以前使用 .NET 的日志记录样式,请将 AWS_LAMBDA_HANDLER_LOG_FORMAT
设置为 Unformatted
。
使用 Lambda 控制台
调用 Lambda 函数后,您可以使用 Lambda 控制台查看日志输出。有关更多信息,请参阅访问 Amazon Lambda 的 Amazon CloudWatch Logs。
使用 CloudWatch 控制台
您可以使用 Amazon CloudWatch 控制台查看所有 Lambda 函数调用的日志。
使用 CloudWatch 控制台查看日志
-
打开 CloudWatch 控制台的 Log groups (日志组)页面
。 -
选择您的函数 (/aws/lambda/
your-function-name
) 的日志组。 -
创建日志流。
每个日志流对应一个函数实例。日志流会在您更新 Lambda 函数以及创建更多实例来处理多个并发调用时显示。要查找特定调用的日志,建议您使用 Amazon X-Ray 检测函数。X-Ray 会在跟踪中记录有关请求和日志流的详细信息。
如需使用将日志和跟踪与 X-Ray 相关联的示例应用程序,请参阅 Amazon Lambda 错误处理器示例应用程序。
使用 Amazon Command Line Interface (Amazon CLI)
Amazon CLI 是一种开源工具,让您能够在命令行 Shell 中使用命令与 Amazon 服务进行交互。要完成本节中的步骤,您必须满足以下条件:
您可以通过 Amazon 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 | 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
。
例 get-logs.sh 脚本
在同一命令提示符下,使用以下脚本下载最后五个日志事件。此脚本使用 sed
从输出文件中删除引号,并休眠 15 秒以等待日志可用。输出包括来自 Lambda 的响应,以及来自 get-log-events
命令的输出。
复制以下代码示例的内容并将其作为 get-logs.sh
保存在 Lambda 项目目录中。
如果使用的是 Amazon CLI 版本 2,则 cli-binary-format 选项必填。您还可以在 Amazon CLI Config 文件中配置此选项。
#!/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 $(cat out) --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" }
删除日志
删除函数时,日志组不会自动删除。要避免无限期存储日志,请删除日志组,或配置一个保留期,在该保留期之后,日志将自动删除。