

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

# 將 Lambda 函式日誌傳送至 CloudWatch Logs
<a name="monitoring-cloudwatchlogs"></a>

依預設，如果函式的執行角色具有必要許可，Lambda 會自動擷取所有函式調用的日誌，並將日誌傳送至 CloudWatch Logs。這些日誌預設存儲在名為 /aws/lambda/*<function-name>* 的日誌群組中。若要增強偵錯功能，您可以將自訂日誌記錄陳述式插入程式碼。如此，Lambda 將與 CloudWatch Logs 無縫整合。您可以視需要使用 Lambda 主控台、AWS CLI 或 Lambda API 設定函式將日誌傳送給其他群組。如需進一步了解，請參閱[設定 CloudWatch 日誌群組](monitoring-cloudwatchlogs-loggroups.md)。

您可以使用 Lambda 主控台、CloudWatch 主控台、AWS Command Line Interface (AWS CLI) 或 CloudWatch API 來檢視 Lambda 函數的日誌。如需詳細資訊，請參閱[檢視 Lambda 函數的 CloudWatch 日誌](monitoring-cloudwatchlogs-view.md)。

**注意**  
在函數調用後，日誌可能需要 5 到 10 分鐘才會顯示。

## 所需的 IAM 許可
<a name="monitoring-cloudwatchlogs-prereqs"></a>

您的[執行角色](lambda-intro-execution-role.md)需要以下許可，才能將日誌上傳至 CloudWatch Logs。
+ `logs:CreateLogGroup`
+ `logs:CreateLogStream`
+ `logs:PutLogEvents`

如需詳細資訊，請參閱《Amazon CloudWatch 使用者指南》**中的 [Using identity-based policies (IAM policies) for CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-identity-based-access-control-cwl.html)。

可以使用 Lambda 提供的 `AWSLambdaBasicExecutionRole` AWS 受管政策來新增 CloudWatch Logs 許可。執行以下命令，將此政策新增至您的角色：

```
aws iam attach-role-policy --role-name your-role --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```

如需更多詳細資訊，請參閱 [在執行角色中使用 AWS 受管政策](permissions-managed-policies.md)。

## 定價
<a name="monitoring-cloudwatchlogs-pricing"></a>

使用 Lambda 日誌無需支付額外費用；但仍需支付標準 CloudWatch Logs 費用。如需詳細資訊，請參閱 [CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

# 設定 CloudWatch 日誌群組
<a name="monitoring-cloudwatchlogs-loggroups"></a>

根據預設，CloudWatch 會在第一次調用時自動為您的函數建立名為 `/aws/lambda/<function name>` 的日誌群組。若要將函數設定為將日誌傳送到現有的日誌群組，或為您的函數建立新的日誌群組，您可以使用 Lambda 主控台或 AWS CLI. 您也可以使用 [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) 和 [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) Lambda API 命令和 AWS Serverless Application Model (AWS SAM) [AWS：：Serverless：：Function]() 資源來設定自訂日誌群組。

您可以設定多個 Lambda 函數，將日誌傳送至同一個 CloudWatch 日誌群組。例如，您可以使用單一日誌群組來儲存組成特定應用程式之所有 Lambda 函數的記錄。當您針對 Lambda 函數使用自訂日誌群組時，Lambda 建立的日誌串流會包含函數名稱和函數版本。如此可確保日誌訊息和函數之間的映射會被保留，即使您對多個函數使用相同的日誌群組也是如此。

自訂日誌群組的日誌串流命名格式遵循下列慣例：

```
YYYY/MM/DD/<function_name>[<function_version>][<execution_environment_GUID>]
```

請注意，設定自訂日誌群組時，您為日誌群組選取的名稱必須遵循 [CloudWatch Logs 命名規則](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)。此外，自訂日誌群組名稱不得以字串 `aws/` 開頭。如果您以 `aws/` 開頭建立自訂日誌群組，Lambda 將無法建立日誌群組。因此，您的函數的日誌將不會傳送到 CloudWatch。

**若要變更函數的日誌群組 (主控台)**

1. 開啟 Lambda 主控台中的 [函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇一個函數。

1. 在函數組態頁面上，選擇**監視和操作工具**。

1. 在**日誌組態**窗格中，選擇**編輯**。

1. 在**日誌群組**窗格中，對於 **CloudWatch 日誌群組**，選擇**自訂**。

1. 在**自訂日誌群組**之下，輸入要將函數傳送日誌前往的 CloudWatch 日誌群組的名稱。如果您輸入現有日誌群組的名稱，則您的函數將使用該群組。如果沒有具有您輸入名稱的日誌群組，則 Lambda 會以該名稱為您的函數建立新的日誌群組。

**若要變更函數的日誌群組 (AWS CLI)**
+ 若要變更現有函數的日誌群組，請使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。

  ```
  aws lambda update-function-configuration \
    --function-name myFunction \
    --logging-config LogGroup=myLogGroup
  ```

**若要在建立函數 (AWS CLI) 時指定自訂日誌群組**
+ 若要在使用 建立新的 Lambda 函數時指定自訂日誌群組 AWS CLI，請使用 `--logging-config`選項。下列範例命令會建立 Node.js Lambda 函數，該函數會將日誌檔傳送至名為 `myLogGroup` 的日誌群組。

  ```
  aws lambda create-function \
    --function-name myFunction \
    --runtime nodejs24.x \
    --handler index.handler \
    --zip-file fileb://function.zip \
    --role arn:aws:iam::123456789012:role/LambdaRole \
    --logging-config LogGroup=myLogGroup
  ```

## 執行角色許可
<a name="monitoring-cloudwatchlogs-configure-permissions"></a>

為了讓您的函數將日誌傳送到 CloudWatch Logs，其必須具有 [logs:PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html) 許可。在您透過 Lambda 主控台設定函式的日誌群組時，Lambda 會在下列條件下將此許可新增至角色：
+ 服務目的地設定為 CloudWatch Logs
+ 函式的執行角色缺少將日誌上傳至 CloudWatch Logs (預設目的地) 的許可

**注意**  
Lambda 不會針對 Amazon S3 或 Firehose 日誌目的地新增任何 Put 許可。

當 Lambda 新增此許可時，它會授予將日誌傳送至任何 CloudWatch Logs 日誌群組的函數許可。

若要防止 Lambda 自動更新函數的執行角色並改為手動編輯，請展開**許可**，然後取消勾選**新增所需許可**。

當您使用 設定函數的日誌群組時 AWS CLI，Lambda 不會自動新增`logs:PutLogEvents`許可。如果函數的執行角色尚不具備許可，請將其新增至函數的執行角色。這些許可包含在 [AWSLambdaBasicExecutionRole](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole$jsonEditor) 受管政策中。

## Lambda 受管執行個體的 CloudWatch 記錄
<a name="monitoring-cloudwatchlogs-lmi"></a>

使用 [Lambda 受管執行個體](lambda-managed-instances.md)時，將日誌傳送至 CloudWatch Logs 還有其他考量：

### VPC 聯網需求
<a name="monitoring-cloudwatchlogs-lmi-networking"></a>

Lambda 受管執行個體會在 VPC 中客戶擁有的 EC2 執行個體上執行。若要將日誌傳送至 CloudWatch Logs，並將追蹤傳送至 X-Ray，您必須確保這些 AWS APIs 可從 VPC 路由。您有多種選擇：
+ **AWS PrivateLink （建議）**：使用 [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html) 為 CloudWatch Logs 和 X-Ray 服務建立 VPC 端點。這可讓您的執行個體私密存取這些服務，而不需要網際網路閘道或 NAT 閘道。如需詳細資訊，請參閱[搭配介面 VPC 端點使用 CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。
+ **NAT 閘道**：設定 NAT 閘道以允許從私有子網路進行傳出網際網路存取。
+ **網際網路閘道**：對於公有子網路，請確定您的 VPC 已設定網際網路閘道。

如果 CloudWatch Logs 或 X-Ray APIs 無法從您的 VPC 路由，您的函數日誌和追蹤將不會交付。

### 並行調用和日誌歸因
<a name="monitoring-cloudwatchlogs-lmi-concurrent"></a>

Lambda 受管執行個體執行環境可以同時處理多個調用。當多個調用同時執行時，其日誌項目會交錯在相同的日誌串流中。若要有效篩選和分析來自並行調用的日誌，您應該確保每個日誌項目都包含 AWS 請求 ID。

我們建議採用下列其中一種方法：
+ **使用預設 Lambda 執行期記錄器 （建議）**：Lambda 受管執行期提供的預設記錄程式庫會自動在每個日誌項目中包含請求 ID。
+ **實作結構化 JSON 記錄**：如果您要建置[自訂執行時間](runtimes-custom.md)或需要自訂記錄，請實作 JSON 格式的日誌，其中包含每個項目中的請求 ID。Lambda 受管執行個體僅支援 JSON 日誌格式。在 JSON 日誌中包含 `requestId` 欄位，以透過調用啟用篩選：

  ```
  {
    "timestamp": "2025-01-15T10:30:00.000Z",
    "level": "INFO",
    "requestId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "message": "Processing request"
  }
  ```

透過請求 ID 屬性，您可以使用 CloudWatch Logs Insights 查詢來篩選特定調用的 CloudWatch Logs 日誌項目。例如：

```
fields @timestamp, @message
| filter requestId = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
| sort @timestamp asc
```

如需 Lambda 受管執行個體記錄需求的詳細資訊，請參閱 [了解 Lambda 受管執行個體執行環境](lambda-managed-instances-execution-environment.md)。

# 檢視 Lambda 函數的 CloudWatch 日誌
<a name="monitoring-cloudwatchlogs-view"></a>

您可以使用 Lambda 主控台、Amazon CloudWatch logs AWS CLI。 CloudWatch AWS Command Line Interface 請遵循下列各章節中的說明以存取函數的日誌。

## 使用 CloudWatch Logs Live Tail 串流函數日誌
<a name="monitoring-live-tail"></a>

Amazon CloudWatch Logs Live Tail 可直接在 Lambda 主控台中顯示新日誌事件的串流清單，協助您快速對函數進行疑難排解。可以透過 Lambda 函數即時地檢視和篩選擷取的日誌，快速偵測並解決問題。

**注意**  
Live Tail 工作階段會按工作階段使用時間 (每分鐘) 產生費用。如需定價的詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/)。

### 比較 Live Tail 與 --log-type Tail
<a name="live-tail-logtype"></a>

CloudWatch Logs Live Tail 與 Lambda API 中的 [LogType： Tail](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#lambda-Invoke-request-LogType) 選項 (`--log-type Tail` 中的） 之間有幾個差異 AWS CLI：
+ `--log-type Tail` 只會傳回調用日誌的前 4 KB。Live Tail 不會共用此限制，每秒最多可接收 500 個日誌事件。
+ `--log-type Tail` 會擷取並傳送含回應的日誌，這可能會對函數的回應延遲造成影響。Live Tail 不會對函數回應延遲造成影響。
+ `--log-type Tail` 僅支援同步調用。Live Tail 對同步和非同步調用皆適用。

**注意**  
[Lambda 受管執行個體](lambda-managed-instances.md)不支援 `--log-type Tail`選項。使用 CloudWatch Logs Live Tail 或直接查詢 CloudWatch Logs 來檢視受管執行個體函數的日誌。

### 許可
<a name="live-tail-permissions"></a>

啟動和停止 CloudWatch Logs Live Tail 工作階段需要以下許可：
+ `logs:DescribeLogGroups`
+ `logs:StartLiveTail`
+ `logs:StopLiveTail`

### 在 Lambda 主控台中啟動 Live Tail 工作階段
<a name="live-tail-console"></a>

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選擇函數的名稱。

1. 選擇**測試**標籤。

1. 在**測試事件**窗格中，選擇 **CloudWatch Logs Live Tail**。

1. 對於**選取日誌群組**，預設選取函數的日誌群組。一次最多可以選取五個日誌群組。

1. (選用) 若要僅顯示包含特定字詞或其他字串的日誌事件，請在**新增篩選條件模式**方塊中輸入字詞或字串。篩選條件欄位區分大小寫。可以在此欄位中包含多個詞彙和模式運算子，包括常規表達式 (regex)。如需詳細資訊，請參閱**《Amazon CloudWatch Logs 使用者指南》中的[篩選條件模式語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html)。

1. 選擇 **開始使用**。相符的日誌事件開始出現在視窗中。

1. 若要停止 Live Tail 工作階段，請選擇**停止**。
**注意**  
Live Tail 工作階段會在閒置 15 分鐘後或者 Lambda 主控台工作階段逾時時自動停止。

## 使用主控台存取函數日誌
<a name="monitoring-cloudwatchlogs-console"></a>

1. 開啟 Lambda 主控台中的[函數頁面](https://console.aws.amazon.com/lambda/home#/functions)。

1. 選取函數。

1. 選擇 **Monitor** (監控) 索引標籤。

1. 選擇**檢視 CloudWatch 日誌**以打開 CloudWatch 主控台。

1. 向下捲動並選擇要查看的函數調用**日誌串流**。  
![\[\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/log-stream.png)

Lambda 函數的每個執行個體都具有專用的日誌串流。如果函數向上擴展，則每個並行執行個體都具有自己的日誌串流。每次建立新的執行環境來回應調用，皆會產生新的日誌串流。日誌串流的命名慣例如下：

```
YYYY/MM/DD[Function version][Execution environment GUID]
```

單一執行環境會在生命週期內寫入相同的日誌串流。日誌串流包含來自該執行環境的訊息，以及來自 Lambda 函數程式碼的任何輸出。每則訊息都會加上時間戳記，包括自訂日誌。即使您的函數未記錄來自程式碼的任何輸出，每次調用也都會產生三個最少的日誌陳述式 (START、END 和 REPORT)：

![\[監控可觀測性圖 3\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-3.png)


這些日誌會顯示：
+  **RequestId** – 這是每個請求產生的唯一 ID。如果 Lambda 函數重試請求，則此 ID 不會變更，且會在每次後續重試的日誌中顯示。
+  **開始/結束** – 此組標記用於界定單次調用範圍，位於其間的所有日誌行皆屬同次調用。
+  **持續時間** – 處理常式函式的總調用時間，不含 `INIT` 程式碼。
+  **計費持續時間** – 為了方便計費，套用四捨五入邏輯。
+  **記憶體大小** - 配置給函式的記憶體數量。
+  **使用的記憶體上限** – 調用期間使用的記憶體上限。
+  **初始化持續時間** – 在主要處理常式外部執行 `INIT` 程式碼區段所耗費的時間。

## 使用 存取日誌 AWS CLI
<a name="monitoring-cloudwatchlogs-cli"></a>

 AWS CLI 是一種開放原始碼工具，可讓您使用命令列 Shell 中的 命令與 AWS 服務互動。若要完成本節中的步驟，您必須擁有 [AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

您可以透過 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)，使用 `--log-type` 命令選項來擷取要調用的日誌。其回應將包含 `LogResult` 欄位，內含該次調用的 base64 編碼日誌 (最大達 4 KB)。

**Example 擷取日誌 ID**  
下列範例顯示如何從名稱為 `my-function` 的函數的 `LogResult` 欄位來擷取*日誌 ID*。  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
您應該會看到下列輸出：  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example 解碼日誌**  
在相同的命令提示中，使用 `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 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。  
您應該會看到下列輸出：  

```
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](https://docs.microsoft.com/en-us/windows/wsl/install-win10) 上使用。macOS 使用者可能需要使用 `base64 -D`。



**Example 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 支援的全域命令列選項](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)。  

```
#!/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
```

**Example macOS 和 Linux (僅限)**  
在相同的命令提示中，macOS 和 Linux 使用者可能需要執行下列命令，以確保指令碼可執行。  

```
chmod -R 755 get-logs.sh
```

**Example 擷取最後五個記錄事件**  
在相同的命令提示中，執行下列指令碼以取得最後五個日誌事件。  

```
./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"
}
```

## 剖析日誌和結構化日誌記錄
<a name="querying-logs"></a>

透過 CloudWatch Logs Insights，您可以使用特殊[查詢語法](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html)來搜尋和分析日誌資料。它透過多個日誌群組執行查詢，並使用 [glob](https://en.wikipedia.org/wiki/Glob_(programming)) 和[規則表達式](https://en.wikipedia.org/wiki/Regular_expression)模式比對提供功能強大的篩選。

您可以在 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 日誌檔案包含指定日誌層級的個別欄位：

![\[監控可觀測性圖 10\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-10.png)


然後，CloudWatch Logs Insights 查詢可以依日誌層級進行篩選。例如，若要僅查詢錯誤，您可以使用下列查詢：

```
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
```

### JSON 結構化日誌記錄
<a name="querying-logs-json"></a>

JSON 通常用於提供應用程式日誌的結構。在下列範例中，日誌已轉換為 JSON 以輸出三個相異值：

![\[監控可觀測性圖 11\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-11.png)


CloudWatch Logs Insights 功能會自動探索 JSON 輸出中的值，並將訊息剖析為欄位，而無需自訂 glob 或規則表達式。透過使用 JSON 結構的日誌，下列查詢會尋找上傳檔案大於 1 MB、上傳時間超過 1 秒且調用不是冷啟動的調用：

```
fields @message
| filter @message like /INFO/
| filter uploadedBytes > 1000000
| filter uploadTimeMS > 1000
| filter invocation != 1
```

此查詢可能產生以下結果：

![\[監控可觀測性圖 12\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-12.png)


JSON 中的已探索欄位會自動填入右側的*已探索欄位*功能表中。Lambda 服務發出的標準欄位字首為 '@'，您可以用相同的方式查詢這些欄位。Lambda 日誌一律包含 @timestamp、@logStream、@message、@requestId、@duration、@billedDuration、@type、@maxMemoryUsed、@memorySize 欄位。如果為函數啟用 X-Ray，日誌也會包含 @xrayTraceId 和 @xraySegmentId。

當 Amazon S3、Amazon SQS 或 Amazon EventBridge 等 AWS 事件來源調用您的函數時，整個事件會以 JSON 物件輸入的形式提供給函數。透過在函式的第一行中記錄此事件，您可以使用 CloudWatch Logs Insights 查詢任何巢狀欄位。

### 實用的 Insights 查詢
<a name="useful-logs-queries"></a>

下表顯示可用於監控 Lambda 函數的範例 Insights 查詢。


| Description | 範例查詢語法 | 
| --- | --- | 
|  最後 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
```  | 

## 日誌視覺化和儀表板
<a name="monitoring-logs-visualization"></a>

對於任何 CloudWatch Logs Insights 查詢，您都可以將結果匯出為 Markdown 或 CSV 格式。在某些情況下，如果至少有一個彙總函式，[透過查詢建立視覺化呈現](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_Insights-Visualizing-Log-Data.html)可能會更有用。`stats` 函式可讓您定義彙總與分組規則。

上一個 *logInsightsJSON* 範例根據上傳大小和上傳時間進行篩選，並排除第一次調用。這會產生資料表。為了監控生產系統，視覺化最小、最大和平均檔案大小來尋找極端值可能更有用。為此，請套用具有所需彙總的 stats 函數，並按時間值 (例如每分鐘) 進行分組：

例如，考量以下查詢。此查詢與 [JSON 結構化日誌記錄](#querying-logs-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)
```

之所以納入這些彙總計算，是因視覺化呈現檔案大小的最小值、最大值與平均值，將更有助於找出異常值。您可以在**視覺化**索引標籤中檢視結果：

![\[監控可觀測性圖 14\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-14.png)


完成建置視覺化後，您可以選擇將圖形新增至 CloudWatch 儀表板。為此，請選擇視覺化上方的**新增至儀表板**。這會將查詢新增為小工具，並可讓您選取自動重新整理間隔，從而讓您更輕鬆地持續監控結果：

![\[監控可觀測性圖 15\]](http://docs.aws.amazon.com/zh_tw/lambda/latest/dg/images/monitoring-observability-figure-15.png)
