View a markdown version of this page

記錄和監控 Ruby Lambda 函數 - AWS Lambda

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

記錄和監控 Ruby Lambda 函數

AWS Lambda 會自動代表您監控 Lambda 函數,並將日誌傳送至 Amazon CloudWatch。您的 Lambda 函數隨附有 CloudWatch Logs 日誌群組,且函數的每一執行個體各有一個日誌串流。Lambda 執行期環境會將每次調用的詳細資訊傳送至日誌串流,並且轉傳來自函數程式碼的日誌及其他輸出。如需詳細資訊,請參閱將 Lambda 函式日誌傳送至 CloudWatch Logs

此頁面說明如何從 Lambda 函數的程式碼產生日誌輸出,並使用 AWS Command Line Interface、Lambda 主控台或 CloudWatch 主控台存取日誌。

建立傳回日誌的函數

若要由您的函式程式碼輸出日誌,可使用 puts 陳述式或者任何能夠寫入 stdoutstderr 的記錄程式庫。下列範例會記錄環境變數和事件物件的值。

範例 lambda_function.rb
# lambda_function.rb def handler(event:, context:) puts "## ENVIRONMENT VARIABLES" puts ENV.to_a puts "## EVENT" puts event.to_a end
範例記錄格式
START RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Version: $LATEST
## ENVIRONMENT VARIABLES
environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]3893xmpl7fac4485b47bb75b671a283c', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...})
## EVENT
{'key': 'value'}
END RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95
REPORT RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95  Duration: 15.74 ms  Billed Duration: 147 ms Memory Size: 128 MB Max Memory Used: 56 MB  Init Duration: 130.49 ms
XRAY TraceId: 1-5e34a614-10bdxmplf1fb44f07bc535a1   SegmentId: 07f5xmpl2d1f6f85 Sampled: true   

Ruby 執行時間會記錄每次調用的 STARTENDREPORT 行。報告明細行提供下列詳細資訊。

REPORT 行資料欄位
  • RequestId - 進行調用的唯一請求 ID。

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

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

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

  • 使用的記憶體上限 - 函數所使用的記憶體數量。當調用共用執行環境時,Lambda 會報告所有調用使用的記憶體上限。此行為可能會導致報告值高於預期值。

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

  • XRAY TraceId - 對於追蹤的請求,這是 AWS X-Ray 追蹤 ID

  • SegmentId - 對於追蹤的請求,這是 X-Ray 區段 ID。

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

如需更詳細的日誌,請使用 使用 Ruby 記錄程式庫

搭配 Ruby 使用 Lambda 進階記錄控制

為了讓您進一步控制函數日誌的擷取、處理和取用方式,Lambda 提供使用 Ruby 的進階記錄控制。對於 Ruby 4.0 和更新版本的執行時間,您可以設定下列記錄選項:

  • 日誌格式 - 選取函數日誌的純文字和結構化 JSON 格式

  • 日誌層級 - 對於 JSON 格式的日誌,請選擇 Lambda 傳送到 Amazon CloudWatch 的日誌之詳細等級,例如 ERROR、DEBUG 或 INFO

  • 日誌群組 - 選擇您的函數將日誌傳送到的 CloudWatch 日誌群組

如需這些日誌選項的詳細資訊,以及如何設定函數以使用這些選項的說明,請參閱 設定 Lambda 函數的進階日誌記錄控制項

若要進一步了解如何搭配 Ruby Lambda 函數使用日誌格式和日誌層級選項,請參閱下列各節中的指引。

搭配 Ruby 使用結構化 JSON 日誌

如果您為函數的日誌格式選取 JSON,Lambda 會將 Ruby 標準Logger程式庫輸出的日誌以結構化 JSON 傳送至 CloudWatch。每個 JSON 日誌物件都包含至少四個鍵值對,其中包含下列索引鍵:

  • "timestamp" - 產生日誌訊息的時間

  • "level" - 指派給訊息的日誌層級

  • "message" - 日誌訊息的內容

  • "requestId" - 進行調用的唯一請求 ID。

Ruby Logger程式庫也可以新增額外的索引鍵值對,例如 "logger"到此 JSON 物件。

以下各節中的範例示範當您將函數的日誌格式設定為 JSON 時,如何在 CloudWatch Logs 中擷取使用 Ruby Logger程式庫產生的日誌輸出。

請注意,如果您使用 puts方法產生 中所述的基本日誌輸出建立傳回日誌的函數,Lambda 會將這些輸出擷取為純文字,即使您將函數的日誌格式設定為 JSON。

使用 Ruby Logger 程式庫的標準 JSON 日誌輸出

下列程式碼片段和日誌輸出範例示範當函數的日誌格式設定為 JSON 時,如何在 CloudWatch Logs 中擷取使用 Ruby Logger程式庫產生的標準日誌輸出。

範例 Ruby 日誌程式碼範例
require 'logger' def lambda_handler(event:, context:) logger = Logger.new($stdout) logger.info("Inside the handler function") end
範例 JSON 日誌記錄範例
{ "timestamp": "2025-10-27T19:17:45.586Z", "level": "INFO", "message": "Inside the handler function", "requestId": "79b4f56e-95b1-4643-9700-2807f4e68189" }

在 JSON 中記錄額外的參數

當函數的日誌格式設定為 JSON 時,您也可以將額外索引鍵值對的雜湊傳遞至日誌輸出,以使用 Ruby Logger程式庫記錄其他參數。

範例 Ruby 日誌程式碼範例
require 'logger' require 'json' def lambda_handler(event:, context:) logger = Logger.new($stdout) extra_params = { "a" => "b", "b" => [3] } logger.info({ message: "extra parameters example" }.merge(extra_params).to_json) end
範例 JSON 日誌記錄範例
{ "timestamp": "2025-11-02T15:26:28Z", "level": "INFO", "message": "extra parameters example", "requestId": "3dbd5759-65f6-45f8-8d7d-5bdc79a3bd01", "a": "b", "b": [ 3 ] }

在 JSON 中記錄例外狀況

下列程式碼片段顯示當您將日誌格式設定為 JSON 時,如何在函數的日誌輸出中擷取 Ruby 例外狀況。請注意,使用 產生的日誌輸出logger.error與例外狀況會指派日誌層級 ERROR。

範例 Ruby 日誌程式碼範例
require 'logger' def lambda_handler(event:, context:) logger = Logger.new($stdout) begin raise "exception" rescue => e logger.error(e) end end
範例 JSON 日誌記錄範例
{ "timestamp": "2025-11-02T16:18:57Z", "level": "ERROR", "message": "exception", "stackTrace": [ " /var/task/lambda_function.rb:4:in `lambda_handler'" ], "errorType": "RuntimeError", "errorMessage": "exception", "requestId": "3f9d155c-0f09-46b7-bdf1-e91dab220855", "location": "/var/task/lambda_function.rb:lambda_handler:6" }

搭配 Ruby 使用日誌層級篩選

透過設定日誌層級篩選,您可以選擇只傳送特定日誌層級或更低層級的日誌至 CloudWatch Logs。若要瞭解如何設定函數的日誌層級篩選,請參閱 日誌層級篩選

若要 AWS Lambda 讓 根據應用程式日誌層級篩選您的應用程式日誌,您的函數必須使用 JSON 格式的日誌。您可以透過兩種方式達成此操作:

  • 使用標準 Ruby Logger程式庫建立日誌輸出,並將函數設定為使用 JSON 日誌格式。 AWS Lambda 然後, 會使用 中所述的 JSON 物件中的"level"鍵值對來篩選日誌輸出搭配 Ruby 使用結構化 JSON 日誌。若要了解如何設定函數的日誌格式,請參閱 設定 Lambda 函數的進階日誌記錄控制項

  • 使用另一個記錄程式庫或方法,在您的程式碼中建立 JSON 結構化日誌,其中包含定義日誌輸出層級的"level"鍵值對。

您也可以使用 puts陳述式輸出包含日誌層級識別符的 JSON 物件。下列puts陳述式會產生 JSON 格式的輸出,其中日誌層級設定為 INFO。如果您函數的日誌層級設定為 INFO、DEBUG 或 TRACE,則 AWS Lambda 會將 JSON 物件傳送至 CloudWatch Logs。

puts '{"msg":"My log message", "level":"info"}'

若要讓 Lambda 篩選函數的日誌,您還必須在 JSON 日誌輸出中包含 "timestamp" 索引鍵值組。必須以有效的 RFC 3339 時間戳記格式指定時間。如果您沒有提供有效的時間戳記,Lambda 會為日誌指派層級 INFO,並為您新增時間戳記。

使用替代日誌程式庫

如果您需要使用程式logger庫的自訂版本,您可以將它包含在部署套件或 Lambda 層中,並將RUBYLIB環境變數設定為程式庫的lib目錄。Lambda 執行時間將載入您的版本,而不是綁定的版本。

如果您的程式碼已使用另一個日誌程式庫來產生 JSON 結構化日誌,則不需要進行任何變更。 AWS Lambda 不會重複編碼任何已編碼 JSON 的日誌。即使您將函數設定為使用 JSON 日誌格式,您的記錄輸出也會以您定義的 JSON 結構顯示於 CloudWatch 中。

在 Lambda 主控台檢視日誌

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

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

在 CloudWatch 主控台中檢視 記錄

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

若要在 CloudWatch 主控台上檢視日誌
  1. 在 CloudWatch 主控台上開啟日誌群組頁面

  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 欄位,內含該次調用的 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

如果您使用的是第 2 AWS CLI 版,則需要 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

如果您使用的是第 2 AWS CLI 版,則需要 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" }

刪除日誌

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

使用 Ruby 記錄程式庫

Ruby 記錄程式庫會傳回易於讀取的精簡日誌。使用記錄公用程式輸出與函數相關的詳細資訊、訊息和錯誤碼。

# lambda_function.rb require 'logger' def handler(event:, context:) logger = Logger.new($stdout) logger.info('## ENVIRONMENT VARIABLES') logger.info(ENV.to_a) logger.info('## EVENT') logger.info(event) event.to_a end

來自 logger 的輸出包含記錄等級、時間戳記和請求 ID。

START RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Version: $LATEST
[INFO]  2020-01-31T22:12:58.534Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    ## ENVIRONMENT VARIABLES

[INFO]  2020-01-31T22:12:58.534Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    environ({'AWS_LAMBDA_LOG_GROUP_NAME': '/aws/lambda/my-function', 'AWS_LAMBDA_LOG_STREAM_NAME': '2020/01/31/[$LATEST]1bbe51xmplb34a2788dbaa7433b0aa4d', 'AWS_LAMBDA_FUNCTION_NAME': 'my-function', ...})

[INFO]  2020-01-31T22:12:58.535Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    ## EVENT

[INFO]  2020-01-31T22:12:58.535Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    {'key': 'value'}

END RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125
REPORT RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125  Duration: 2.75 ms   Billed Duration: 117 ms Memory Size: 128 MB Max Memory Used: 56 MB  Init Duration: 113.51 ms
XRAY TraceId: 1-5e34a66a-474xmpl7c2534a87870b4370   SegmentId: 073cxmpl3e442861 Sampled: true