C# 中的 Lambda 函數日誌記錄 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

C# 中的 Lambda 函數日誌記錄

AWS Lambda 自動監控 Lambda 函數,並將日誌項目傳送到 Amazon CloudWatch。您的 Lambda 函數隨附一個 CloudWatch 日誌記錄群組和函數每個執行個體的日誌串流。Lambda 執行期環境會將每次調用的詳細資訊和函數程式碼的其他輸出,傳送至日誌串流。如需有關 CloudWatch 記錄檔的詳細資訊,請參閱使用 Amazon CloudWatch 日誌 AWS Lambda

建立傳回日誌的函數

若要由您的函數程式碼輸出日誌,您可以使用主控台類別的方法,或任何能寫入 stdoutstderr 的記錄程式庫。

.NET 執行期會記錄每次調用的 STARTENDREPORT 行。報告明細行提供下列詳細資訊。

REPORT 行資料欄位
  • RequestId— 呼叫的唯一要求 ID。

  • 持續時間 - 函數的處理常式方法處理事件所花費的時間量。

  • 計費持續時間 - 調用的計費時間量。

  • 記憶體大小 - 分配給函數的記憶體數量。

  • 使用的記憶體上限 - 函數所使用的記憶體數量。

  • 初始化持續時間 - 對於第一個提供的請求,這是執行期載入函數並在處理常式方法之外執行程式碼所花費的時間量。

  • XRAY TraceId — 針對追蹤的要求,則為AWS X-Ray 追蹤識別碼。

  • SegmentId— 針對追蹤的請求,X-Ray 區段 ID。

  • 已取樣 - 對於追蹤的請求,這是取樣結果。

工具與程式庫

Powertools to AWS Lambda (.NET) 是一套開發人員工具組,用來實作無伺服器最佳實務並提高開發人員速度。記錄公用程式提供 Lambda 優化記錄器,其中包含有關所有函數之函數內容的其他資訊,輸出結構為 JSON。使用此公用程式執行下列操作:

  • 從 Lambda 內容、冷啟動和 JSON 形式的結構記錄輸出中擷取關鍵欄位

  • 在收到指示時記錄 Lambda 調用事件 (預設為停用)

  • 透過日誌採樣僅列印調用百分比的所有日誌 (預設為停用)

  • 在任何時間點將其他金鑰附加至結構化日誌

  • 使用自訂日誌格式化程式 (自帶格式化程式),以與組織的日誌記錄 RFC 相容的結構輸出日誌。

使用動力工具進行 AWS Lambda (.NET)和結構化日 AWS SAM 誌記錄

請按照下面的步驟來下載,構建和部署示例你好世界 C# 應用程序與集成 Powertools 的模塊使用 AWS SAM. AWS Lambda 此應用程式實作了基本 API 後端,並使用 Powertools 發送日誌、指標和追蹤。其包含 Amazon API Gateway 端點和 Lambda 函數。當您將 GET 請求傳送至 API Gateway 端點時,Lambda 函數會叫用、使用內嵌指標格式將記錄和指標傳送至 CloudWatch,並將追蹤傳送至 AWS X-Ray。該函數會傳回 hello world 訊息。

必要條件

若要完成本節中的步驟,您必須執行下列各項:

部署範例 AWS SAM 應用程式
  1. 使用 Hello World TypeScript 範本初始化應用程式。

    sam init --app-template hello-world-powertools-dotnet --name sam-app --package-type Zip --runtime dotnet6 --no-tracing
  2. 建置應用程式。

    cd sam-app && sam build
  3. 部署應用程式。

    sam deploy --guided
  4. 依照螢幕上的提示操作。若要接受互動體驗中提供的預設選項,請按下 Enter

    注意

    因為HelloWorldFunction 可能沒有定義授權,這可以嗎? ,請務必輸入y

  5. 取得已部署應用程式的 URL:

    aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
  6. 調用 API 端點:

    curl -X GET <URL_FROM_PREVIOUS_STEP>

    成功的話,您將會看到以下回應:

    {"message":"hello world"}
  7. 若要獲取該函數的日誌,請執行 sam 日誌。如需詳細資訊,請參閱《AWS Serverless Application Model 開發人員指南》 中的 使用日誌

    sam logs --stack-name sam-app

    日誌輸出如下:

    2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:27.988000 INIT_START Runtime Version: dotnet:6.v13 Runtime Version ARN: arn:aws:lambda:ap-southeast-2::runtime:699f346a05dae24c58c45790bc4089f252bf17dae3997e79b17d939a288aa1ec 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:28.229000 START RequestId: bed25b38-d012-42e7-ba28-f272535fb80e Version: $LATEST 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:29.259000 2023-02-20T14:15:29.201Z bed25b38-d012-42e7-ba28-f272535fb80e info {"_aws":{"Timestamp":1676902528962,"CloudWatchMetrics":[{"Namespace":"sam-app-logging","Metrics":[{"Name":"ColdStart","Unit":"Count"}],"Dimensions":[["FunctionName"],["Service"]]}]},"FunctionName":"sam-app-HelloWorldFunction-haKIoVeose2p","Service":"PowertoolsHelloWorld","ColdStart":1} 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:30.479000 2023-02-20T14:15:30.479Z bed25b38-d012-42e7-ba28-f272535fb80e info {"ColdStart":true,"XrayTraceId":"1-63f3807f-5dbcb9910c96f50742707542","CorrelationId":"d3d4de7f-4ccc-411a-a549-4d67b2fdc015","FunctionName":"sam-app-HelloWorldFunction-haKIoVeose2p","FunctionVersion":"$LATEST","FunctionMemorySize":256,"FunctionArn":"arn:aws:lambda:ap-southeast-2:123456789012:function:sam-app-HelloWorldFunction-haKIoVeose2p","FunctionRequestId":"bed25b38-d012-42e7-ba28-f272535fb80e","Timestamp":"2023-02-20T14:15:30.4602970Z","Level":"Information","Service":"PowertoolsHelloWorld","Name":"AWS.Lambda.Powertools.Logging.Logger","Message":"Hello world API - HTTP 200"} 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:30.599000 2023-02-20T14:15:30.599Z bed25b38-d012-42e7-ba28-f272535fb80e info {"_aws":{"Timestamp":1676902528922,"CloudWatchMetrics":[{"Namespace":"sam-app-logging","Metrics":[{"Name":"ApiRequestCount","Unit":"Count"}],"Dimensions":[["Service"]]}]},"Service":"PowertoolsHelloWorld","ApiRequestCount":1} 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:30.680000 END RequestId: bed25b38-d012-42e7-ba28-f272535fb80e 2023/02/20/[$LATEST]4eaf8445ba7a4a93b999cb17fbfbecd8 2023-02-20T14:15:30.680000 REPORT RequestId: bed25b38-d012-42e7-ba28-f272535fb80e Duration: 2450.99 ms Billed Duration: 2451 ms Memory Size: 256 MB Max Memory Used: 74 MB Init Duration: 240.05 ms XRAY TraceId: 1-63f3807f-5dbcb9910c96f50742707542 SegmentId: 16b362cd5f52cba0
  8. 這是可透過網際網路存取的公有 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

使用 Lambda 主控台

您可以在調用 Lambda 函數之後,使用 Lambda 主控台來檢視日誌輸出。

如果可以從內嵌程式碼編輯器測試您的程式碼,您會在執行結果中找到日誌。使用主控台測試功能以調用函數時,您會在詳細資訊區段找到日誌輸出

使用控 CloudWatch 制台

您可以使用 Amazon 主 CloudWatch 控台來檢視所有 Lambda 函數叫用的日誌。

在 CloudWatch 主控台上檢視記錄檔
  1. 在主控台上開啟 [記錄群組] 頁 CloudWatch 面

  2. 為您的函數選擇日誌組(/aws/lambda/ your-function-name)。

  3. 選擇日誌串流

每個日誌串流都會對應至函式的執行個體。當您更新 Lambda 函數,以及建立額外執行個體以處理多個並行調用時,便會出現日誌串流。要查找特定調用的日誌,我們建議使用檢測您的函數。 AWS X-RayX-Ray 會在追蹤內記錄有關請求和日誌串流的詳細資訊。

若要使用會讓日誌和追蹤與 X-Ray 相互關聯的範例應用程式,請參閱 適用於 AWS Lambda 的錯誤處理器範例應用程式

使用 AWS Command Line Interface (AWS CLI)

這 AWS CLI 是一種開放原始碼工具,可讓您使用命令列殼層中的命令與 AWS 服務互動。若要完成本節中的步驟,您必須執行下列各項:

您可以透過 AWS CLI,使用 --log-type 命令選項來擷取要調用的日誌。其回應將包含 LogResult 欄位,內含該次調用的 base64 編碼日誌 (最大達 4 KB)。

範例 擷取日誌 ID

下列範例顯示如何從名稱為 my-function 的函數的 LogResult 欄位來擷取日誌 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

如果您使用的是 AWS CLI 版本 2,則需要此cli-binary-format選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》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 命令的輸出。

複製下列程式碼範例的內容,並將您的 Lambda 專案目錄儲存為 get-logs.sh

如果您使用的是 AWS CLI 版本 2,則需要此cli-binary-format選項。若要讓此成為預設的設定,請執行 aws configure set cli-binary-format raw-in-base64-out。若要取得更多資訊,請參閱《AWS Command Line Interface 使用者指南第 2 版》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" }

刪除日誌

當您刪除函數時,不會自動刪除日誌群組。若要避免無限期地儲存日誌,請刪除日誌群組,或設定保留期間,系統會在該時間之後自動刪除日誌。