本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
檢視 Lambda 函數的 CloudWatch 日誌
您可以使用 Lambda 主控台、 CloudWatch 主控台或 AWS Command Line Interface () 來檢視 Lambda 函數的 Amazon CloudWatch 日誌AWS CLI。請依照下列各節中的說明存取函數的日誌。
使用 Logs Live Tail 串流函數 CloudWatch 日誌
Amazon CloudWatch Logs Live Tail 可直接在 Lambda 主控台中顯示新日誌事件的串流清單,協助您快速疑難排解函數。可以透過 Lambda 函數即時地檢視和篩選擷取的日誌,快速偵測並解決問題。
注意
Live Tail 工作階段會按工作階段使用時間 (每分鐘) 產生費用。如需定價的詳細資訊,請參閱 Amazon CloudWatch 定價
比較 Live Tail 與 --log-type Tail
CloudWatch Logs Live Tail 與 Lambda 中的 LogType: Tail 選項之間有幾個差異 API(--log-type Tail
中的 AWS CLI):
-
--log-type Tail
只會傳回調用日誌的前 4 KB。Live Tail 不會共用此限制,每秒最多可接收 500 個日誌事件。 -
--log-type Tail
會擷取並傳送帶有回應的日誌,這可能會影響函數的回應延遲。Live Tail 不會影響函數回應延遲。 -
--log-type Tail
僅支援同步調用。Live Tail 對同步和非同步調用皆適用。
許可
啟動和停止 CloudWatch Logs Live Tail 工作階段需要下列許可:
-
logs:DescribeLogGroups
-
logs:StartLiveTail
-
logs:StopLiveTail
在 Lambda 主控台中啟動 Live Tail 工作階段
-
開啟 Lambda 主控台中的函數頁面
。 -
選擇函數的名稱。
-
選擇測試標籤。
-
在測試事件窗格中,選擇CloudWatch 記錄即時尾隨。
-
對於選取日誌群組,預設選取函數的日誌群組。一次最多可以選取五個日誌群組。
-
(選用) 若要僅顯示包含特定字詞或其他字串的日誌事件,請在新增篩選條件模式方塊中輸入字詞或字串。篩選條件欄位區分大小寫。可以在此欄位中包含多個詞彙和模式運算子,包括常規表達式 (regex)。如需模式語法的詳細資訊,請參閱《Amazon CloudWatch Logs 使用者指南》中的篩選模式語法。
-
選擇 開始使用。相符的日誌事件開始出現在視窗中。
-
若要停止 Live Tail 工作階段,請選擇停止。
注意
Live Tail 工作階段會在閒置 15 分鐘後或者 Lambda 主控台工作階段逾時時自動停止。
使用主控台存取函數日誌
開啟 Lambda 主控台中的函數頁面
。 -
選取函數。
-
選擇 監控 索引標籤。
-
選擇檢視 CloudWatch 日誌以開啟 CloudWatch 主控台。
-
向下捲動並選擇要查看的函數調用日誌串流。
Lambda 函數的每個執行個體都具有專用的日誌串流。如果函數向上擴展,則每個並行執行個體都具有自己的日誌串流。每次建立新的執行環境以回應調用時,就會產生新的日誌串流。日誌串流的命名慣例如下:
YYYY/MM/DD[Function version][Execution environment GUID]
單一執行環境會在生命週期內寫入相同的日誌串流。日誌串流包含來自該執行環境的訊息,以及來自 Lambda 函數程式碼的任何輸出。每個訊息都會加上時間戳記,包括您的自訂日誌。即使您的函數未記錄來自程式碼的任何輸出,每次叫用都會產生三個最少的日誌陳述式 ( STARTEND和 REPORT):
這些日誌會顯示:
-
RequestId – 這是每個請求產生的唯一 ID。如果 Lambda 函數重試請求,則此 ID 不會變更,且會在每次後續重試的日誌中顯示。
-
開始/結束 – 這些書籤是單一調用,因此這些之間的每個日誌行都屬於相同的調用。
-
持續時間 – 處理常式函數的總呼叫時間,不含
INIT
程式碼。 -
計費持續時間 – 將四捨五入邏輯套用至計費目的。
-
記憶體大小 – 配置給函數的記憶體量。
-
已使用的最大記憶體 – 調用期間使用的實際記憶體。
-
初始化持續時間 – 在主處理常式之外執行程式碼
INIT
區段所需的時間。
使用 存取日誌 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 Windowsbase64 -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-namestream1
--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"
}
剖析日誌和結構化日誌記錄
使用 CloudWatch Logs Insights,您可以使用特殊查詢語法來搜尋和分析日誌資料。它透過多個日誌群組執行查詢,並使用 glob
您可以在 Lambda 函數中實作結構化記錄,以利用這些功能。結構化記錄會將日誌組織成預先定義的格式,讓您更輕鬆地查詢。使用日誌層級是產生易於篩選日誌的重要第一步,該日誌會將資訊性訊息與警告或錯誤分開。例如,請考慮下列 Node.js 程式碼:
exports.handler = async (event) => { console.log("console.log - Application is fine") console.info("console.info - This is the same as console.log") console.warn("console.warn - Application provides a warning") console.error("console.error - An error occurred") }
產生的 CloudWatch 日誌檔案包含指定日誌層級的個別欄位:
然後, CloudWatch Logs Insights 查詢可以篩選日誌層級。例如,若要查詢錯誤,您可以使用下列查詢:
fields @timestamp, @message | filter @message like /ERROR/ | sort @timestamp desc
JSON 結構化記錄
JSON 通常用於提供應用程式日誌的結構。在下列範例中,日誌已轉換為 JSON以輸出三個不同的值:
CloudWatch Logs Insights 功能會自動探索JSON輸出中的值,並將訊息剖析為欄位,而不需要自訂 glob 或規則表達式。透過使用 JSON結構式日誌,下列查詢會尋找已上傳檔案大於 1 MB、上傳時間超過 1 秒,而且呼叫不是冷啟動的呼叫:
fields @message | filter @message like /INFO/ | filter uploadedBytes > 1000000 | filter uploadTimeMS > 1000 | filter invocation != 1
此查詢可能產生下列結果:
在 中探索的欄位JSON會自動填入右側的探索欄位選單中。Lambda 服務發出的標準欄位字首為 '@',您可以用相同的方式查詢這些欄位。Lambda 日誌一律包含 @timestamp、@logStream、@message、@requestId、@duration、@billedDuration、@type、@maxMemoryUsed、@ 等欄位memorySize。如果為函數啟用 X-Ray,日誌也會包含 @ xrayTraceId 和 @xraySegmentId。
當 Amazon S3、Amazon SQS或 Amazon 等 AWS 事件來源 EventBridge 調用您的 函數時,整個事件會以JSON物件輸入的形式提供給函數。透過在函數的第一行記錄此事件,您可以使用 CloudWatch Logs Insights 查詢任何巢狀欄位。
實用的 Insights 查詢
下表顯示可用於監控 Lambda 函數的範例 Insights 查詢。
描述 | 範例查詢語法 |
---|---|
最後 100 個錯誤 |
fields Timestamp, LogLevel, Message | filter LogLevel == "ERR" | sort @timestamp desc | limit 100 |
前 100 個最高計費調用 |
filter @type = "REPORT" | fields @requestId, @billedDuration | sort by @billedDuration desc | limit 100 |
冷啟動佔總調用次數的百分比 |
filter @type = "REPORT" | stats sum(strcontains(@message, "Init Duration"))/count(*) * 100 as coldStartPct, avg(@duration) by bin(5m) |
Lambda 持續時間的百分位數報告 |
filter @type = "REPORT" | stats avg(@billedDuration) as Average, percentile(@billedDuration, 99) as NinetyNinth, percentile(@billedDuration, 95) as NinetyFifth, percentile(@billedDuration, 90) as Ninetieth by bin(30m) |
Lambda 記憶體用量的百分位數報告 |
filter @type="REPORT" | stats avg(@maxMemoryUsed/1024/1024) as mean_MemoryUsed, min(@maxMemoryUsed/1024/1024) as min_MemoryUsed, max(@maxMemoryUsed/1024/1024) as max_MemoryUsed, percentile(@maxMemoryUsed/1024/1024, 95) as Percentile95 |
使用 100% 指派記憶體的調用 |
filter @type = "REPORT" and @maxMemoryUsed=@memorySize | stats count_distinct(@requestId) by bin(30m) |
跨調用使用的平均記憶體 |
avgMemoryUsedPERC, avg(@billedDuration) as avgDurationMS by bin(5m) |
視覺化記憶體統計資料 |
filter @type = "REPORT" | stats max(@maxMemoryUsed / 1024 / 1024) as maxMemMB, avg(@maxMemoryUsed / 1024 / 1024) as avgMemMB, min(@maxMemoryUsed / 1024 / 1024) as minMemMB, (avg(@maxMemoryUsed / 1024 / 1024) / max(@memorySize / 1024 / 1024)) * 100 as avgMemUsedPct, avg(@billedDuration) as avgDurationMS by bin(30m) |
Lambda 結束的調用 |
filter @message like /Process exited/ | stats count() by bin(30m) |
逾時的調用 |
filter @message like /Task timed out/ | stats count() by bin(30m) |
延遲報告 |
filter @type = "REPORT" | stats avg(@duration), max(@duration), min(@duration) by bin(5m) |
過度佈建的記憶體 |
filter @type = "REPORT" | stats max(@memorySize / 1024 / 1024) as provisonedMemMB, min(@maxMemoryUsed / 1024 / 1024) as smallestMemReqMB, avg(@maxMemoryUsed / 1024 / 1024) as avgMemUsedMB, max(@maxMemoryUsed / 1024 / 1024) as maxMemUsedMB, provisonedMemMB - maxMemUsedMB as overProvisionedMB |
日誌視覺化和儀表板
對於任何 CloudWatch Logs Insights 查詢,您可以將結果匯出為減價或CSV格式。在某些情況下,如果至少有一個彙總函數,則從查詢建立視覺化可能比較有用。stats
函數可讓您定義彙總和分組。
先前的logInsightsJSON範例會依上傳大小和上傳時間篩選,並排除第一個調用。這會產生資料表。為了監控生產系統,視覺化最小、最大和平均檔案大小來尋找極端值可能更有用。為此,請套用具有所需彙總的 stats 函數,並按時間值 (例如每分鐘) 進行分組:
例如,請考慮下列查詢。這是來自 JSON 結構化記錄區段的相同範例查詢,但具有其他彙總函數:
fields @message | filter @message like /INFO/ | filter uploadedBytes > 1000000 | filter uploadTimeMS > 1000 | filter invocation != 1 | stats min(uploadedBytes), avg(uploadedBytes), max(uploadedBytes) by bin (1m)
我們包含這些彙總,因為視覺化最小、最大和平均檔案大小以尋找極端值可能更有用。您可以在視覺化索引標籤中檢視結果:
完成建置視覺化之後,您可以選擇將圖形新增至 CloudWatch 儀表板。為此,請選擇視覺化上方的新增至儀表板。這會將查詢新增為小工具,並可讓您選取自動重新整理間隔,從而讓您更輕鬆地持續監控結果: