本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
記錄和監控 TypeScript Lambda 函數
AWS Lambda 會自動監控 Lambda 函數,並將日誌項目傳送至 Amazon CloudWatch。您的 Lambda 函數隨附有 CloudWatch Logs 日誌群組,且函數的每一執行個體各有一個日誌串流。Lambda 執行期環境會將每次調用的詳細資訊和函數程式碼的其他輸出,傳送至日誌串流。如需 CloudWatch Logs 的詳細資訊,請參閱 將 CloudWatch Logs 與 Lambda 搭配使用。
若要由您的函數程式碼輸出日誌,您可以在主控台物件stdout
或 stderr
的記錄程式庫。
章節
使用日誌記錄工具和程式庫
Powertools for AWS Lambda TypeScript
從 Lambda 內容、冷啟動和 JSON 形式的結構記錄輸出中擷取關鍵欄位
在收到指示時記錄 Lambda 調用事件 (預設為停用)
透過日誌採樣僅列印調用百分比的所有日誌 (預設為停用)
在任何時間點將其他金鑰附加至結構化日誌
使用自訂日誌格式化程式 (自帶格式化程式),以與組織的日誌記錄 RFC 相容的結構輸出日誌。
使用 Powertools for AWS Lambda (TypeScript) 和 AWS SAM 進行結構化日誌記錄
請依照以下步驟操作,使用 AWS SAM 透過整合式 Powertools for AWS Lambda (TypeScript)hello world
訊息。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Node.js 18.x 或更新版本
-
AWS SAM CLI 1.75 版或更新版本 如果您使用舊版 AWS SAM CLI,請參閱升級 AWS SAM CLI。
部署範例 AWS 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 may not have authorization defined, Is this okay?,確保輸入
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 日誌。如需詳細資訊,請參閱《AWS 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
管理日誌保留
當您刪除函數時,不會自動刪除日誌群組。若要避免無限期地儲存日誌,請刪除日誌群組,或設定保留期間,CloudWatch 會在該時間之後自動刪除日誌。若要設定日誌保留,請將下列項目新增至 AWS 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 AWS Lambda (TypeScript) 和 AWS CDK 進行結構化日誌記錄
請依照以下步驟操作,使用 AWS CDK 透過整合式 Powertools for AWS Lambda (TypeScript)hello world
訊息。
必要條件
若要完成本節中的步驟,您必須執行下列各項:
-
Node.js 18.x 或更新版本
-
AWS SAM CLI 1.75 版或更新版本 如果您使用舊版 AWS SAM CLI,請參閱升級 AWS SAM CLI。
部署範例 AWS 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。這是定義 AWS 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 日誌。如需詳細資訊,請參閱《AWS 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 主控台上開啟日誌群組頁面
。 -
選擇您的函數的日誌群組 (/aws/lambda/
your-function-name
)。 -
選擇日誌串流
每個日誌串流都會對應至函式的執行個體。當您更新 Lambda 函數,以及建立額外執行個體以處理多個並行調用時,便會出現日誌串流。若要尋找特定調用的日誌,建議使用 AWS X-Ray 來檢測函數。X-Ray 會在追蹤內記錄有關請求和日誌串流的詳細資訊。