TypeScript Lambda 函数日志记录和监控
Amazon Lambda 将自动监控 Lambda 函数并将日志条目发送到 Amazon CloudWatch。您的 Lambda 函数带有一个 CloudWatch Logs 日志组以及函数的每个实例的日志流。Lambda 运行时系统环境会将每次调用的详细信息以及函数代码的其他输出发送到该日志流。有关 CloudWatch Logs 的更多信息,请参阅将 CloudWatch Logs 日志与 Lambda 结合使用。
要从函数代码输出日志,可以使用控制台对象stdout
或 stderr
的日志记录库。
Sections
使用日志记录工具和库
Powertools for Amazon Lambda(TypeScript)
从 Lambda 上下文中捕获关键字段,冷启动并将日志记录输出结构化为 JSON
根据指示记录 Lambda 调用事件(默认情况下禁用)
通过日志采样仅针对一定百分比的调用输出所有日志(默认情况下禁用)
在任何时间点将其他键附加到结构化日志
使用自定义日志格式设置程序(自带格式设置程序),从而在与组织的日志记录 RFC 兼容的结构中输出日志
将 Powertools for Amazon Lambda(TypeScript)和 Amazon SAM 用于结构化日志记录
请按照以下步骤使用 Amazon SAM 通过集成的 Powertools for Amazon Lambda(TypeScript)hello world
消息。
先决条件
要完成本节中的步骤,您必须满足以下条件:
-
Node.js 18.x 或更高版本
-
Amazon SAM CLI 版本 1.75 或更高版本。如果您使用的是旧版本的 Amazon SAM CLI,请参阅升级 Amazon SAM CLI。
部署示例 Amazon SAM 应用程序
-
使用 Hello World TypeScript 模板初始化该应用程序。
sam init --app-template hello-world-powertools-typescript --name sam-app --package-type Zip --runtime nodejs18.x
-
构建应用程序。
cd sam-app && sam build
-
部署应用程序。
sam deploy --guided
-
按照屏幕上的提示操作。要在交互式体验中接受提供的默认选项,请按
Enter
。注意
对于 HelloWorldFunction 可能没有定义授权,确定执行此操作吗?,确保输入
y
。 -
获取已部署应用程序的 URL:
aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
-
调用 API 端点:
curl
<URL_FROM_PREVIOUS_STEP>
如果成功,您将会看到如下响应:
{"message":"hello world"}
-
要获取该函数的日志,请运行 sam logs。有关更多信息,请参阅《Amazon Serverless Application Model 开发人员指南》中的 使用日志。
sam logs --stack-name sam-app
该日志输出类似于以下示例:
2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.552000 START RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Version: $LATEST 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.594000 2022-08-31T09:33:10.557Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390556,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[{"Name":"ColdStart","Unit":"Count"}]}]},"service":"helloWorld","ColdStart":1} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.595000 2022-08-31T09:33:10.595Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"level":"INFO","message":"This is an INFO log - sending HTTP 200 - hello world response","service":"helloWorld","timestamp":"2022-08-31T09:33:10.594Z"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.655000 2022-08-31T09:33:10.655Z 70693159-7e94-4102-a2af-98a6343fb8fb INFO {"_aws":{"Timestamp":1661938390655,"CloudWatchMetrics":[{"Namespace":"sam-app","Dimensions":[["service"]],"Metrics":[]}]},"service":"helloWorld"} 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 END RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb 2023/01/31/[$LATEST]4d53e8d279824834a1ccd35511a4949c 2022-08-31T09:33:10.754000 REPORT RequestId: 70693159-7e94-4102-a2af-98a6343fb8fb Duration: 201.55 ms Billed Duration: 202 ms Memory Size: 128 MB Max Memory Used: 66 MB Init Duration: 252.42 ms XRAY TraceId: 1-630f2ad5-1de22b6d29a658a466e7ecf5 SegmentId: 567c116658fbf11a Sampled: true
-
这是一个可以通过互联网访问的公有 API 端点。我们建议您在测试后删除该端点。
sam delete
管理日志保留日期
删除函数时,日志组不会自动删除。要避免无限期存储日志,请删除日志组,或配置一个保留期,在该保留期结束后,日志将自动删除。要设置日志保留日期,请将以下内容添加到您的 Amazon SAM 模板中:
Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: # Omitting other properties LogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}" RetentionInDays: 7
将 Powertools for Amazon Lambda(TypeScript)和 Amazon CDK 用于结构化日志记录
请按照以下步骤使用 Amazon CDK 通过集成的 Powertools for Amazon Lambda(TypeScript)hello world
消息。
先决条件
要完成本节中的步骤,您必须满足以下条件:
-
Node.js 18.x 或更高版本
-
Amazon SAM CLI 版本 1.75 或更高版本。如果您使用的是旧版本的 Amazon SAM CLI,请参阅升级 Amazon SAM CLI。
部署示例 Amazon CDK 应用程序
-
为您的新应用程序创建一个项目目录。
mkdir hello-world cd hello-world
-
初始化该应用程序。
cdk init app --language typescript
-
添加 @types/aws-lambda
软件包作为开发依赖项。 npm install -D @types/aws-lambda
-
安装 Powertools Logger 实用程序
。 npm install @aws-lambda-powertools/logger
-
打开 lib 目录。您应该会看到一个名为 hello-world-stack.ts 的文件。在此目录中创建两个新文件:hello-world.function.ts 和 hello-world.ts。
-
打开 hello-world.function.ts,然后将以下代码添加到该文件。这是适用于 Lambda 函数的代码。
import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda'; import { Logger } from '@aws-lambda-powertools/logger'; const logger = new Logger(); export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => { logger.info('This is an INFO log - sending HTTP 200 - hello world response'); return { statusCode: 200, body: JSON.stringify({ message: 'hello world', }), }; };
-
打开 hello-world.ts,然后将以下代码添加到该文件。它包含 NodejsFunction 构造,该构造创建 Lambda 函数,为 Powertools 配置环境变量,并将日志保留日期设置为一周。它还包括创建 REST API 的 LambdaRestApi 构造。
import { Construct } from 'constructs'; import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs'; import { LambdaRestApi } from 'aws-cdk-lib/aws-apigateway'; import { RetentionDays } from 'aws-cdk-lib/aws-logs'; import { CfnOutput } from 'aws-cdk-lib'; export class HelloWorld extends Construct { constructor(scope: Construct, id: string) { super(scope, id); const helloFunction = new NodejsFunction(this, 'function', { environment: { Powertools_SERVICE_NAME: 'helloWorld', LOG_LEVEL: 'INFO', }, logRetention: RetentionDays.ONE_WEEK, }); const api = new LambdaRestApi(this, 'apigw', { handler: helloFunction, }); new CfnOutput(this, 'apiUrl', { exportName: 'apiUrl', value: api.url, }); } }
-
打开 hello-world-stack.ts。这是定义您的 Amazon CDK 堆栈的代码。使用以下代码替换该代码:
import { Stack, StackProps } from 'aws-cdk-lib'; import { Construct } from 'constructs'; import { HelloWorld } from './hello-world'; export class HelloWorldStack extends Stack { constructor(scope: Construct, id: string, props?: StackProps) { super(scope, id, props); new HelloWorld(this, 'hello-world'); } }
-
转回项目目录。
cd hello-world
-
部署您的应用程序。
cdk deploy
-
获取已部署应用程序的 URL:
aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?ExportName==`apiUrl`].OutputValue' --output text
-
调用 API 端点:
curl
<URL_FROM_PREVIOUS_STEP>
如果成功,您将会看到如下响应:
{"message":"hello world"}
-
要获取该函数的日志,请运行 sam logs。有关更多信息,请参阅《Amazon Serverless Application Model 开发人员指南》中的 使用日志。
sam logs --stack-name HelloWorldStack
该日志输出类似于以下示例:
2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.047000 START RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Version: $LATEST 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.050000 { "level": "INFO", "message": "This is an INFO log - sending HTTP 200 - hello world response", "service": "helloWorld", "timestamp": "2022-08-31T14:48:37.048Z", "xray_trace_id": "1-630f74c4-2b080cf77680a04f2362bcf2" } 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 END RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c 2023/01/31/[$LATEST]2ca67f180dcd4d3e88b5d68576740c8e 2022-08-31T14:48:37.082000 REPORT RequestId: 19ad1007-ff67-40ce-9afe-0af0a9eb512c Duration: 34.60 ms Billed Duration: 35 ms Memory Size: 128 MB Max Memory Used: 57 MB Init Duration: 173.48 ms
-
这是一个可以通过互联网访问的公有 API 端点。我们建议您在测试后删除该端点。
cdk destroy
在 Lambda 控制台中查看日志
调用 Lambda 函数后,您可以使用 Lambda 控制台查看日志输出。
如果可以在嵌入式代码编辑器中测试代码,则可以在执行结果中找到日志。使用控制台测试功能调用函数时,可以在详细信息部分找到日志输出。
在 CloudWatch 控制台中查看日志
您可以使用 Amazon CloudWatch 控制台查看所有 Lambda 函数调用的日志。
使用 CloudWatch 控制台查看日志
-
打开 CloudWatch 控制台的 Log groups
(日志组页面)。 -
选择您的函数 (/aws/lambda/
your-function-name
) 的日志组。 -
创建日志流。
每个日志流对应一个函数实例。日志流会在您更新 Lambda 函数以及创建更多实例来处理多个并发调用时显示。要查找特定调用的日志,建议您使用 Amazon X-Ray 检测函数。X-Ray 会在追踪中记录有关请求和日志流的详细信息。