

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

# 使用 Lambda 函式日誌
<a name="monitoring-logs"></a>

為了協助您故障診斷故障， 會代表您 AWS Lambda 自動監控 Lambda 函數。您可以使用 Lambda 主控台、CloudWatch 主控台、 AWS Command Line Interface (AWS CLI)、CloudWatch API 來檢視 Lambda 函數的日誌。您也可以設定 Lambda 將日誌傳送至 Amazon S3 與 Firehose。

只要函式的[執行角色](lambda-intro-execution-role.md)具有必要許可，Lambda 就會擷取函式處理的所有請求的日誌，並將日誌傳送至預設目的地 Amazon CloudWatch Logs。您也可以透過 Lambda 主控台，將 Amazon S3 或 Firehose 設定為日誌記錄目的地。
+ **CloudWatch Logs** 是 Lambda 函式預設的日誌記錄目的地。CloudWatch Logs 具有即時日誌檢視與分析功能，且支援根據日誌資料建立指標與警示。
+ **Amazon S3** 在長期儲存方面具有經濟效益，且可透過 Athena 等服務對日誌進行分析。延遲通常較高。
+ **Firehose** 提供受管日誌串流功能，可將日誌串流至多種目的地。如果您需要將日誌傳送至 AWS 其他服務 （例如 OpenSearch Service 或 Redshift Data API) 或第三方平台 （例如 Datadog、New Relic 或 Splunk)，Firehose 會透過提供預先建置的整合來簡化該程序。您也可以將日誌串流至自訂 HTTP 端點，無需額外設定基礎結構。

## 選擇用於傳送日誌的服務目的地
<a name="choosing-log-destination"></a>

在選擇要用作函式日誌的服務目的地時，建立考量下列關鍵因素：
+ **成本管理因服務而異。**Amazon S3 通常是最經濟實惠的長期儲存選擇，而 CloudWatch Logs 支援即時檢視日誌、處理日誌和設定提醒。Firehose 成本包括串流服務費用以及與所設定串流目的地相關的費用。
+ **分析功能因服務而異。**CloudWatch Logs 在即時監控方面表現出色，能夠與其他 CloudWatch 功能 (例如 Logs Insights 和 Live Tail) 原生整合。Amazon S3 與 Athena 等分析工具搭配運作良好，並且可以與各種服務整合，但可能需要額外的設定。Firehose 透過提供預先建置的整合，簡化直接串流至特定 AWS 服務 （例如 OpenSearch Service 和 Redshift Data API) 和支援的第三方平台 （例如 Datadog 和 Splunk)，進而減少組態工作。
+ **設定程序與易用性因服務而異。**CloudWatch Logs 是預設的日誌目的地，無需額外設定即可立即運作，支援透過 CloudWatch 主控台直觀地檢視與分析日誌。若需將日誌傳送至 Amazon S3，應先在 Lambda 主控台中執行部分初始設定，並設定儲存貯體許可。若需將日誌直接傳送至 OpenSearch Service 等服務或第三方分析平台，Firehose 可以簡化該流程。

## 設定日誌目的地
<a name="configuring-log-destinations"></a>

AWS Lambda 支援函數日誌的多個目的地。本指南介紹了可用的日誌記錄目的地，能協助您視需求做出正確選擇。無論選擇哪種目的地，Lambda 皆能提供用於控制日誌格式、篩選條件與傳送方式的相關選項。

Lambda 支援 JSON 與純文字格式的函式日誌。JSON 結構化日誌能夠提升可搜尋性，支援自動化分析；而純文字日誌較為簡潔，可能降低儲存成本。您可以透過設定系統與應用程式日誌的日誌層級，控制 Lambda 傳送至所選目的地的日誌。篩選功能可協助您管理儲存成本，讓您在偵錯期間更輕鬆地找到相關的日誌項目。

如需每個目的地的詳細設定說明，請參閱下列各節：
+ [將 Lambda 函式日誌傳送至 CloudWatch Logs](monitoring-cloudwatchlogs.md)
+ [將 Lambda 函式日誌傳送至 Firehose](logging-with-firehose.md)
+ [將 Lambda 函式日誌傳送至 Amazon S3](logging-with-s3.md)

## 設定 Lambda 函數的進階日誌記錄控制項
<a name="monitoring-cloudwatchlogs-advanced"></a>

為了讓您更全面地掌控函式日誌的擷取、處理與使用方式，Lambda 提供了下列日誌記錄組態選項：
+ **日誌格式** – 在純文字和結構化 JSON 格式之間為函式日誌選擇一種格式。
+ **日誌層級** – 對於 JSON 結構化日誌，請選擇 Lambda 要傳送至 CloudWatch 之日誌的詳細層級，例如 `FATAL`、`ERROR`、`WARN`、`INFO`、`DEBUG` 和 `TRACE`。
+ **日誌群組** – 選擇函式要將日誌傳送到的 CloudWatch 日誌群組。

若要進一步了解如何設定進階日誌記錄控制項，請參閱下列章節：
+ [設定 JSON 和純文字日誌格式](monitoring-cloudwatchlogs-logformat.md)
+ [日誌層級篩選](monitoring-cloudwatchlogs-log-level.md)
+ [設定 CloudWatch 日誌群組](monitoring-cloudwatchlogs-loggroups.md)

# 設定 JSON 和純文字日誌格式
<a name="monitoring-cloudwatchlogs-logformat"></a>

將日誌輸出擷取為 JSON 索引鍵值組可以在偵錯函數時更容易搜尋和篩選。使用 JSON 格式的日誌檔，您也可以在日誌檔中新增標籤和內容資訊。這可以幫助您對大量日誌資料執行自動分析。除非您的開發工作流程仰賴使用純文字 Lambda 日誌的現有工具，否則建議您為日誌格式選取 JSON。

**Lambda 受管執行個體**  
Lambda 受管執行個體僅支援 JSON 日誌格式。當您建立受管執行個體函數時，Lambda 會自動將日誌格式設定為 JSON，而且您無法將其變更為純文字。如需受管執行個體的詳細資訊，請參閱 [Lambda 受管執行個體](lambda-managed-instances.md)。

對於所有 Lambda 受管執行期，您可以選擇是以非結構化純文字還是 JSON 格式將函數的系統日誌傳送至 CloudWatch Logs 日誌。系統日誌是 Lambda 產生的日誌，有時也稱為平台事件日誌。

對於[支援的執行期](#monitoring-cloudwatchlogs-logformat-supported)，當您使用其中一種支援的內建記錄方法時，Lambda 也能以結構化 JSON 格式輸出函數的應用程式日誌 (函數程式碼產生的日誌)。當您針對這些執行期設定函數的日誌格式時，您選擇的組態會同時套用至系統和應用程式日誌。

對於支援的執行期，如果您的函數使用支援的記錄程式庫或方法，則不需要變更 Lambda 現有程式碼，即可擷取結構化 JSON 中的記錄。

**注意**  
使用 JSON 日誌格式新增其他中繼資料，並將日誌訊息編碼為包含一系列索引鍵值組的 JSON 物件。因此，函數日誌訊息的大小可能會增加。

## 支援的執行期和記錄方法
<a name="monitoring-cloudwatchlogs-logformat-supported"></a>

 Lambda 目前支援針對下列執行期輸出 JSON 結構化應用程式日誌的選項。


| Language | 支援的版本 | 
| --- | --- | 
| Java | 除了 Amazon Linux 1 上的 Java 8 以外的所有 Java 執行期 | 
| .NET | .NET 8 及更新版本 | 
| Node.js | Node.js 16 及更高版本 | 
| Python | Python 3.8 及更高版本 | 
| Rust | N/A | 

若要讓 Lambda 以結構化 JSON 格式將函數的應用程式日誌傳送至 CloudWatch，您的函數必須使用下列內建記錄工具來輸出日誌檔：
+ **Java**：`LambdaLogger`記錄器或 Log4j2。如需詳細資訊，請參閱[記錄和監控 Java Lambda 函數](java-logging.md)。
+ **.NET**：內容物件上的`ILambdaLogger`執行個體。如需詳細資訊，請參閱[記錄和監控 C\$1 Lambda 函數](csharp-logging.md)。
+ **Node.js** - 主控台方法 `console.trace`、`console.debug`、`console.log``console.info`、`console.error`、 和 `console.warn`。如需詳細資訊，請參閱[記錄和監控 Node.js Lambda 函數](nodejs-logging.md)。
+ **Python**：標準 Python `logging`程式庫。如需詳細資訊，請參閱[記錄和監控 Python Lambda 函數](python-logging.md)。
+ **Rust**：`tracing`木箱。如需詳細資訊，請參閱[記錄和監控 Rust Lambda 函數](rust-logging.md)。

對於其他受管的 Lambda 執行期，Lambda 目前僅支援以結構化 JSON 格式擷取系統記錄。不過，您仍然可以使用 Powertools 等記錄工具來擷取任何執行時間中結構式 JSON 格式的應用程式日誌，用於 AWS Lambda 輸出 JSON 格式的日誌輸出。

## 預設日誌格式
<a name="monitoring-cloudwatchlogs-format-default"></a>

目前，所有 Lambda 執行期的預設日誌格式都是純文字。對於 Lambda 受管執行個體，日誌格式一律為 JSON，且無法變更。

如果您已經使用 Powertools for 之類的日誌程式庫 AWS Lambda ，以 JSON 結構化格式產生函數日誌，則如果您選取 JSON 日誌格式，則不需要變更程式碼。Lambda 不會對任何已經進行 JSON 編碼的日誌進行雙重編碼，因此您函數的應用程式日誌將繼續像以前一樣被擷取。

## 系統日誌的 JSON 格式
<a name="monitoring-cloudwatchlogs-JSON-system"></a>

當您將函數的日誌檔格式設定為 JSON 時，每個系統日誌項目 (平台事件) 都會擷取為 JSON 物件，其中包含與下列索引鍵配對的索引鍵值：
+ `"time"` - 產生日誌訊息的時間
+ `"type"` - 記錄的事件類型
+ `"record"` - 日誌輸出的內容

`"record"` 值的格式會根據日誌的事件類型而有所不同。如需更多資訊，請參閱[遙測 API `Event` 物件類型](telemetry-schema-reference.md#telemetry-api-events)。如需有關指派給系統日誌事件的日誌層級的詳細資訊，請參閱 [系統日誌層級事件映射](monitoring-cloudwatchlogs-log-level.md#monitoring-cloudwatchlogs-log-level-mapping)。

為了進行比較，下列兩個範例會以純文字和結構化 JSON 格式顯示相同的記錄輸出。請注意，在大多數情況下，系統日誌事件在 JSON 格式輸出時所包含的資訊會比以純文字輸出時更多。

**Example 純文字：**  

```
2024-03-13 18:56:24.046000 fbe8c1   INIT_START  Runtime Version: python:3.12.v18  Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
```

**Example 結構化的 JSON：**  

```
{
  "time": "2024-03-13T18:56:24.046Z",
  "type": "platform.initStart",
  "record": {
    "initializationType": "on-demand",
    "phase": "init",
    "runtimeVersion": "python:3.12.v18",
    "runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0"
  }
}
```

**注意**  
[使用遙測 API 即時存取延伸功能的遙測資料](telemetry-api.md) 始終以 JSON 格式發出平台事件，例如 `START` 和 `REPORT`。設定 Lambda 傳送至 CloudWatch 的系統日誌格式不會影響 Lambda 遙測 API 行為。

## 應用程式日誌的 JSON 格式
<a name="monitoring-cloudwatchlogs-JSON-application"></a>

當您將函數的日誌格式設定為 JSON 時，使用支援的記錄程式庫和方法撰寫的應用程式日誌輸出會擷取為 JSON 物件，其中包含具有以下索引鍵的鍵值對。
+ `"timestamp"` - 產生日誌訊息的時間
+ `"level"` - 指派給訊息的日誌層級
+ `"message"` - 日誌訊息的內容
+ `"requestId"` (Python、.NET 和 Node.js) 或 `"AWSrequestId"` (Java) - 函數調用的唯一請求 ID

依據您的函數使用的執行期和記錄方法，此 JSON 物件還可能包含其他鍵值對。例如，在 Node.js 中，如果您的函數使用 `console` 方法來記錄使用多個引數的錯誤物件，JSON 物件將包含具有索引鍵 `errorMessage`、`errorType` 和 `stackTrace` 的額外鍵值對。若要進一步了解不同 Lambda 執行期中的 JSON 格式的日誌，請參閱 [記錄和監控 Python Lambda 函數](python-logging.md)、[記錄和監控 Node.js Lambda 函數](nodejs-logging.md) 和 [記錄和監控 Java Lambda 函數](java-logging.md)。

**注意**  
Lambda 用於時間戳記值的關鍵對於系統日誌和應用程式日誌而言不同。對於系統記錄，Lambda 會使用索引鍵 `"time"` 來維持遙測 API 的一致性。對於應用程式日誌，Lambda 會遵循支援的執行期和使用 `"timestamp"` 的慣例。

為了進行比較，下列兩個範例會以純文字和結構化 JSON 格式顯示相同的記錄輸出。

**Example 純文字：**  

```
2024-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
```

**Example 結構化的 JSON：**  

```
{
    "timestamp":"2024-10-27T19:17:45.586Z",
    "level":"INFO",
    "message":"some log message",
    "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189"
}
```

## 設定函數的日誌格式
<a name="monitoring-cloudwatchlogs-set-format"></a>

若要設定函數的日誌格式，您可以使用 Lambda 主控台或 AWS Command Line Interface (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](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) 資源和 CloudFormation [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html) 資源來設定函數的日誌格式。

變更函數的日誌格式不會影響儲存在 CloudWatch Logs 日誌中的現有記錄。只有新的日誌檔會使用更新的格式。

如果您將函數的日誌格式變更為 JSON 但未設定日誌層級，Lambda 會自動將函數的應用程序日誌層級和系統日誌層級設為 INFO。這意味著 Lambda 只會傳送 INFO 及更低層級的日誌輸出至 CloudWatch Logs。若要進一步了解應用程式和系統日誌層級篩選，請參閱 [日誌層級篩選](monitoring-cloudwatchlogs-log-level.md) 

**注意**  
對於 Python 執行期，當函數的日誌格式設定為純文字時，預設的日誌層級設定為 WARN。這意味著 Lambda 只會傳送 WARN 及更低層級的日誌輸出至 CloudWatch Logs。將函數的日誌格式變更為 JSON 會改變此預設行為。若要進一步了解以 Python 記錄日誌，請參閱 [記錄和監控 Python Lambda 函數](python-logging.md)。

對於發出內嵌指標格式 (EMF) 日誌的 Node.js 函數，將函數的日誌格式變更為 JSON 可能會導致 CloudWatch 無法識別您的指標。

**重要**  
如果您的函數使用 Powertools for AWS Lambda (TypeScript) 或開放原始碼 EMF 用戶端程式庫來發出 EMF 日誌，請將 [Powertools](https://github.com/aws-powertools/powertools-lambda-typescript) 和 [EMF](https://www.npmjs.com/package/aws-embedded-metrics) 程式庫更新為最新版本，以確保 CloudWatch 可以繼續正確剖析您的日誌。如果您切換到 JSON 日誌格式，我們也建議您進行測試，以確保與函數的內嵌指標相容。如需有關發出 EMF 日誌檔之 node.js 函數的進一步建議，請參閱 [搭配結構化 JSON 日誌使用內嵌指標格式 (EMF) 用戶端程式庫](nodejs-logging.md#nodejs-logging-advanced-emf)。

**若要設定函數的日誌格式 (主控台)**

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

1. 選擇一個函數。

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

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

1. 在**日誌內容**之下，針對**日誌檔格式**選取**文字**或 **JSON**。

1. 選擇**儲存**。

**若要變更現有函數的日誌格式 (AWS CLI)**
+ 若要變更現有函數的日誌格式，請使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。將 `LoggingConfig` 中 `LogFormat` 選項設定為 `JSON` 或 `Text`。

  ```
  aws lambda update-function-configuration \
    --function-name myFunction \
    --logging-config LogFormat=JSON
  ```

**若要在建立函數 (AWS CLI) 時設定記錄格式**
+ 若要在建立新函數時設定日誌格式，請使用 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 命令中的 `--logging-config` 選項。將 `LogFormat` 設定為 `JSON` 或 `Text`。下列範例命令會建立一個 Node.js 函數，以結構化 JSON 輸出日誌。

  如果您在建立函數時未指定日誌格式，Lambda 會針對您選取的執行期版本使用預設日誌格式。如需有關預設記錄格式的資訊，請參閱 [預設日誌格式](#monitoring-cloudwatchlogs-format-default)。

  ```
  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 LogFormat=JSON
  ```

# 日誌層級篩選
<a name="monitoring-cloudwatchlogs-log-level"></a>

Lambda 可以篩選函數的日誌，以便僅將特定詳細資料層級或更低層級的日誌傳送到 CloudWatch 日誌。您可以針對函數的系統日誌 (Lambda 產生的日誌) 和應用程式日誌 (函數程式碼產生的日誌) 分別設定日誌層級篩選。

對於 [支援的執行期和記錄方法](monitoring-cloudwatchlogs-logformat.md#monitoring-cloudwatchlogs-logformat-supported)，您無需對函數程式碼進行任何變更，Lambda 即可篩選函數的應用程式日誌。

對於所有其他執行期和記錄方法，您的函數程式碼必須將日誌事件輸出至 `stdout` 或 `stderr` 作為 JSON 格式的物件，其中包含與索引鍵 `"level"` 配對的索引鍵值)。例如，Lambda 會將下列輸出解譯為 `stdout` 作為 DEBUG 層級日誌檔。

```
print('{"level": "debug", "msg": "my debug log", "timestamp": "2024-11-02T16:51:31.587199Z"}')
```

如果 `"level"` 值欄位無效或遺失，Lambda 會將日誌輸出指派層級 INFO。若要讓 Lambda 使用時間戳記欄位，您必須以有效的 [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) 時間戳記格式指定時間。如果您沒有提供有效的時間戳記，Lambda 會為日誌指派層級 INFO，並為您新增時間戳記。

命名時間戳記索引鍵時，請遵循您使用的執行期慣例。Lambda 支援受管理執行期使用的大多數通用命名慣例。

**注意**  
若要使用日誌層級篩選，您的函數必須設定為使用 JSON 記錄格式。所有 Lambda 受管執行期的預設日誌格式目前都是純文字。若要瞭解如何將函數的日誌格式設定為 JSON，請參閱 [設定函數的日誌格式](monitoring-cloudwatchlogs-logformat.md#monitoring-cloudwatchlogs-set-format)。

對於應用程式日誌 (由函數程式碼生成的日誌)，您可以在以下日誌層級之間進行選擇。


| 日誌層級 | 標準用量 | 
| --- | --- | 
| TRACE (大多數詳細資訊) | 用於追蹤程式碼執行路徑的最精細資訊 | 
| DEBUG | 系統偵錯的詳細資訊 | 
| INFO | 記錄函數正常操作的訊息 | 
| WARN | 有關可能導致未解決意外行為的潛在錯誤的消息 | 
| ERROR | 有關阻止程式碼按預期執行的問題的訊息 | 
| FATAL (最少詳細資訊) | 有關導致應用程式停止運作的嚴重錯誤訊息 | 

當您選取日誌層級時，Lambda 會將該層級或更低層級的日誌傳送至 CloudWatch Logs 日誌。例如，如果您將函數的應用程式日誌層級設定為 WARN，Lambda 就不會在 INFO 和 DEBUG 層級傳送日誌輸出。日誌篩選的預設應用程式日誌層級為 INFO。

當 Lambda 篩選函數的應用程式日誌時，沒有層級的日誌訊息將被指派日誌等級 INFO。

對於系統日誌檔 (Lambda 服務產生的日誌檔)，您可以在下列日誌層級進行選擇。


| 日誌層級 | Usage | 
| --- | --- | 
| DEBUG (大多數詳細資訊) | 系統偵錯的詳細資訊 | 
| INFO | 記錄函數正常操作的訊息 | 
| WARN (最少詳細資訊) | 有關可能導致未解決意外行為的潛在錯誤的消息 | 

當您選取日誌層級時，Lambda 會在該層級 (含) 或更低層級傳送日誌。例如，如果您將函數的系統日誌層級設定為 INFO，Lambda 不會在 DEBUG 層級傳送日誌輸出。

根據預設，Lambda 會將系統日誌層級設定為 INFO。透過此設定，Lambda 會自動將 `"start"` 和 `"report"` 日誌訊息傳送到 CloudWatch。若要接收更多或更少詳細的系統日誌，請將日誌層級變更為 DEBUG 或 WARN。若要查看 Lambda 映射不同系統日誌事件的記錄層級清單，請參閱 [系統日誌層級事件映射](#monitoring-cloudwatchlogs-log-level-mapping)。

## 設定日誌層級篩選
<a name="monitoring-cloudwatchlogs-log-level-setting"></a>

若要為您的函數設定應用程式和系統日誌層級篩選，您可以使用 Lambda 主控台或 AWS Command Line Interface (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](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html) 資源和 CloudFormation [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html) 資源來設定函數的日誌層級。

請注意，如果您在程式碼中設定函數的日誌層級，此設定會優先於您的任何其他日誌層級設定。例如，如果您使用 Python `logging` `setLevel()` 方法將函數的記錄層級設定為 INFO，則此設定的優先級將高於您使用 Lambda 主控台設定的 WARN 層級。

**若要設定現有函數的應用程式或系統日誌層級 (主控台)**

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

1. 選擇一個函數。

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

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

1. 在**日誌內容**之下，針對**日誌檔格式**，確保已選取 **JSON**

1. 使用選項按鈕，為您的函數選擇所需的**應用程式日誌層級**和**系統日誌層級**。

1. 選擇**儲存**。

**若要設定現有函數的應用程式或系統日誌層級 (AWS CLI)**
+ 若要變更現有函數的應用程式或系統日誌層級，請使用 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 命令。使用 `SystemLogLevel` 將 `--logging-config` 設定為 `DEBUG`、`INFO` 或 `WARN` 中的其中一項。設定 `ApplicationLogLevel` 為 `DEBUG`、`INFO`、`WARN`、`ERROR` 或 `FATAL` 之一。

  ```
  aws lambda update-function-configuration \
    --function-name myFunction \
    --logging-config LogFormat=JSON,ApplicationLogLevel=ERROR,SystemLogLevel=WARN
  ```

**若要在建立函數時設定日誌層級篩選**
+ 若要在建立新函數時設定日誌層級篩選，請使用 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 命令將 `--logging-config` 設定為 `SystemLogLevel` 和 `ApplicationLogLevel` 金鑰。設定 `SystemLogLevel` 為 `DEBUG`、`INFO` 或 `WARN` 之一。設定 `ApplicationLogLevel` 為 `DEBUG`、`INFO`、`WARN`、`ERROR` 或 `FATAL` 之一。

  ```
  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 LogFormat=JSON,ApplicationLogLevel=ERROR,SystemLogLevel=WARN
  ```

## 系統日誌層級事件映射
<a name="monitoring-cloudwatchlogs-log-level-mapping"></a>

對於 Lambda 產生的系統層級日誌事件，以下資料表定義指派給每個事件的日誌層級。若要進一步瞭解資料表中所列事件，請參閱 [Lambda 遙測 API `Event` 結構描述參考](telemetry-schema-reference.md)


| 事件名稱 | 條件 | 指派的日誌層級 | 
| --- | --- | --- | 
| initStart | runtimeVersion已設定 | INFO | 
| initStart | runtimeVersion未設定 | DEBUG | 
| initRuntimeDone | status=success | DEBUG | 
| initRuntimeDone | status\$1=success | WARN | 
| initReport | initializationType\$1=on-demand | INFO | 
| initReport | initializationType=on-demand | DEBUG | 
| initReport | status\$1=success | WARN | 
| restoreStart | runtimeVersion已設定 | INFO | 
| restoreStart | runtimeVersion未設定 | DEBUG | 
| restoreRuntimeDone | status=success | DEBUG | 
| restoreRuntimeDone | status\$1=success | WARN | 
| restoreReport | status=success | INFO | 
| restoreReport | status\$1=success | WARN | 
| 入門 | - | INFO | 
| runtimeDone | status=success | DEBUG | 
| runtimeDone | status\$1=success | WARN | 
| 報告 | status=success | INFO | 
| 報告 | status\$1=success | WARN | 
| 副檔名 | state=success | INFO | 
| 副檔名 | state\$1=success | WARN | 
| logSubscription | - | INFO | 
| telemetrySubscription | - | INFO | 
| logsDropped | - | WARN | 

**注意**  
[使用遙測 API 即時存取延伸功能的遙測資料](telemetry-api.md) 始終發出一組完整的平台事件。設定 Lambda 傳送至 CloudWatch 的系統日誌層級不會影響 Lambda 遙測 API 行為。

## 使用自訂執行期的應用程式日誌層級篩選
<a name="monitoring-cloudwatchlogs-log-level-custom"></a>

當您為函數設定應用程式日誌層級篩選時，Lambda 會在幕後使用 `AWS_LAMBDA_LOG_LEVEL` 環境變數在執行期設定應用程式日誌層級。Lambda 也會使用 `AWS_LAMBDA_LOG_FORMAT` 環境變數來設定函數的日誌格式。您可以使用這些變數，將 Lambda 進階日誌控制項整合至[自訂執行期](runtimes-custom.md)。

若要透過 Lambda 主控台 AWS CLI和 Lambda APIs 使用自訂執行期來設定函數的記錄設定，請設定您的自訂執行期來檢查這些環境變數的值。然後，您可以根據您選取的日誌格式和日誌層級來設定執行期的日誌程式。

# 將 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)


# 將 Lambda 函式日誌傳送至 Firehose
<a name="logging-with-firehose"></a>

Lambda 主控台現在提供將函式日誌傳送至 Firehose 的選項。此功能可將日誌即時串流至 Firehose 支援的多種目的地，包括第三方分析工具與自訂端點。

**注意**  
您可以透過 Lambda 主控台、AWS CLI、AWS CloudFormation 和所有 AWS SDK，設定將 Lambda 函式日誌傳送至 Firehose。

## 定價
<a name="logging-firehose-pricing"></a>

如需定價詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs)。

## Firehose 日誌目的地的必要許可
<a name="logging-firehose-permissions"></a>

在使用 Lambda 主控台將 Firehose 設定為函式的日誌目的地時，您需要滿足如下條件：

1. 將 CloudWatch Logs 與 Lambda 搭配使用[所需的 IAM 許可](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs)。

1. [設定與 Firehose 搭配使用的訂閱篩選條件](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#FirehoseExample)。此篩選條件會定義要傳送至 Firehose 串流的日誌事件。

## 將 Lambda 函式日誌傳送至 Firehose
<a name="logging-firehose-setup"></a>

在 Lambda 主控台中，您可以在建立新函式之後將函式日誌直接傳送至 Firehose。若要執行此動作，請執行下列步驟：

1. 登入 AWS 管理主控台，並開啟 Lambda 主控台。

1. 選擇函式的名稱。

1. 選擇 **Configuration** (組態) 索引標籤。

1. 選擇**監控與操作工具**索引標籤。

1. 在「日誌記錄組態」區段中，選擇**編輯**。

1. 在「日誌內容」區段中，選取一種日誌格式。

1. 在「日誌目的地」區段中，完成下列步驟：

   1. 選擇目的地服務。

   1. 選擇**建立新日誌群組**，或使用**現有日誌群組**。
**注意**  
若為 Firehose 目的地選擇現有日誌群組，請確保所選日誌群組的類型為 `Delivery` 日誌群組。

   1. 選擇 Firehose 串流。

   1. CloudWatch `Delivery` 日誌群組隨即顯示。

1. 選擇**儲存**。

**注意**  
若主控台中提供的 IAM 角色沒有必要許可，則目的地設定會失敗。若要修正此問題，請參閱「Firehose 日誌目的地的必要許可」一節，提供必要許可。

## 跨帳戶日誌記錄
<a name="cross-account-logging-firehose"></a>

您可以設定 Lambda 將日誌傳送至不同 AWS 帳戶的 Firehose 傳輸串流。這需要設定目的地，並在兩個帳戶中設定適當的許可。

如需有關設定跨帳戶日誌記錄的詳細說明，包括必要的 IAM 角色與政策，請參閱 CloudWatch Logs 文件中的 [Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html)。

# 將 Lambda 函式日誌傳送至 Amazon S3
<a name="logging-with-s3"></a>

您可以透過 Lambda 主控台設定 Lambda 函式，將日誌直接傳送至 Amazon S3。此功能為長期日誌儲存提供了一種經濟實惠的解決方案，還可使用 Athena 等服務實現強大的分析功能。

**注意**  
您可以透過 Lambda 主控台、AWS CLI、AWS CloudFormation 和所有 AWS SDK，設定將 Lambda 函式日誌傳送至 Amazon S3。

## 定價
<a name="logging-s3-pricing"></a>

如需定價詳細資訊，請參閱 [Amazon CloudWatch 定價](https://aws.amazon.com/cloudwatch/pricing/#Vended_Logs)。

## Amazon S3 日誌目的地的必要許可
<a name="logging-s3-permissions"></a>

在使用 Lambda 主控台將 Amazon S3 設定為函式的日誌目的地時，您需要滿足如下條件：

1. 將 CloudWatch Logs 與 Lambda 搭配使用[所需的 IAM 許可](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html#monitoring-cloudwatchlogs-prereqs)。

1. [設定 CloudWatch Logs 訂閱篩選條件，將 Lambda 函式日誌傳送至 Amazon S3](#using-cwl-subscription-filter-lambda-s3)。此篩選條件會定義要傳送至 Amazon S3 儲存貯體的日誌事件。

## 設定 CloudWatch Logs 訂閱篩選條件，將 Lambda 函式日誌傳送至 Amazon S3
<a name="using-cwl-subscription-filter-lambda-s3"></a>

要將日誌從 CloudWatch Logs 傳送至 Amazon S3，您需建立訂閱篩選條件。此篩選條件會定義要傳送至 Amazon S3 儲存貯體的日誌事件。您的 Amazon S3 儲存貯體必須與日誌群組位於同一個區域。

### 建立 Amazon S3 的訂閱篩選條件
<a name="create-subscription-filter-s3"></a>

1. 建立 Amazon Simple Storage Service (Amazon S3) 儲存貯體。我們建議您使用專為 CloudWatch Logs 建立的儲存貯體。不過，如果您想要使用現有的儲存貯體，請跳到步驟 2。

   執行以下命令，將預留位置 Region 換成您想要使用的區域：

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-bucket2 --create-bucket-configuration LocationConstraint=region
   ```
**注意**  
`amzn-s3-demo-bucket2` 為 Amazon S3 儲存貯體名稱的範例。該名稱已被*保留*。若要讓此程序正常運作，您必須將其取代為唯一的 Amazon S3 儲存貯體名稱。

   下列為範例輸出：

   ```
   {
       "Location": "/amzn-s3-demo-bucket2"
   }
   ```

1. 建立 IAM 角色，授予 CloudWatch Logs 將資料放入 Amazon S3 儲存貯體的許可。此政策包含一個 aws:SourceArn 全域條件內容索引鍵，可協助防範混淆代理人安全問題。如需詳細資訊，請參閱[混淆代理人防範](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-confused-deputy.html)。

   1. 使用文字編輯器在 `~/TrustPolicyForCWL.json` 檔案中建立信任政策，如下所示：

      ```
      {
          "Statement": {
              "Effect": "Allow",
              "Principal": { "Service": "logs.amazonaws.com" },
              "Condition": { 
                  "StringLike": {
                      "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                  } 
               },
              "Action": "sts:AssumeRole"
          } 
      }
      ```

   1. 使用 create-role 命令來建立 IAM 角色，並指定信任政策檔案。請注意傳回的 Role.Arn 值，因您將在後續步驟需要此值：

      ```
      aws iam create-role \
       --role-name CWLtoS3Role \
       --assume-role-policy-document file://~/TrustPolicyForCWL.json
      {
          "Role": {
              "AssumeRolePolicyDocument": {
                  "Statement": {
                      "Action": "sts:AssumeRole",
                      "Effect": "Allow",
                      "Principal": {
                          "Service": "logs.amazonaws.com"
                      },
                      "Condition": { 
                          "StringLike": {
                              "aws:SourceArn": "arn:aws:logs:region:123456789012:*"
                          } 
                      }
                  }
              },
              "RoleId": "AAOIIAH450GAB4HC5F431",
              "CreateDate": "2015-05-29T13:46:29.431Z",
              "RoleName": "CWLtoS3Role",
              "Path": "/",
              "Arn": "arn:aws:iam::123456789012:role/CWLtoS3Role"
          }
      }
      ```

1. 建立許可政策以定義 CloudWatch Logs 可在您的帳戶上執行哪些動作。首先，使用文字編輯器來建立檔案 `~/PermissionsForCWL.json` 中的許可政策：

   ```
   {
     "Statement": [
       {
         "Effect": "Allow",
         "Action": ["s3:PutObject"],
         "Resource": ["arn:aws:s3:::amzn-s3-demo-bucket2/*"]
       }
     ]
   }
   ```

   使用下列 `put-role-policy` 命令，將許可政策與角色建立關聯：

   ```
   aws iam put-role-policy --role-name CWLtoS3Role --policy-name Permissions-Policy-For-S3 --policy-document file://~/PermissionsForCWL.json
   ```

1. 建立一個 `Delivery` 日誌群組，或使用現有的 `Delivery` 日誌群組。

   ```
   aws logs create-log-group --log-group-name my-logs --log-group-class DELIVERY --region REGION_NAME
   ```

1. 使用 `PutSubscriptionFilter` 命令設定目的地

   ```
   aws logs put-subscription-filter
   --log-group-name my-logs
   --filter-name my-lambda-delivery
   --filter-pattern ""
   --destination-arn arn:aws:s3:::amzn-s3-demo-bucket2
   --role-arn arn:aws:iam::123456789012:role/CWLtoS3Role
   --region REGION_NAME
   ```

## 將 Lambda 函式日誌傳送至 Amazon S3
<a name="logging-s3-setup"></a>

在 Lambda 主控台中，您可以在建立新函式之後將函式日誌直接傳送至 Amazon S3。若要執行此動作，請執行下列步驟：

1. 登入 AWS 管理主控台，並開啟 Lambda 主控台。

1. 選擇函式的名稱。

1. 選擇 **Configuration** (組態) 索引標籤。

1. 選擇**監控與操作工具**索引標籤。

1. 在「日誌記錄組態」區段中，選擇**編輯**。

1. 在「日誌內容」區段中，選取一種日誌格式。

1. 在「日誌目的地」區段中，完成下列步驟：

   1. 選擇目的地服務。

   1. 選擇**建立新日誌群組**，或使用**現有日誌群組**。
**注意**  
若為 Amazon S3 目的地選擇現有日誌群組，請確保所選日誌群組的類型為 `Delivery` 日誌群組。

   1. 選擇要用作函式日誌目的地的 Amazon S3 儲存貯體。

   1. CloudWatch `Delivery` 日誌群組隨即顯示。

1. 選擇**儲存**。

**注意**  
若主控台中提供的 IAM 角色沒有必要許可，則目的地設定會失敗。若要修正此問題，請參閱 [Amazon S3 日誌目的地的必要許可](#logging-s3-permissions)。

## 跨帳戶日誌記錄
<a name="cross-account-logging-s3"></a>

您可以設定 Lambda 將日誌傳送至不同 AWS 帳戶的 Amazon S3 儲存貯體。這需要設定目的地，並在兩個帳戶中設定適當的許可。

如需有關設定跨帳戶日誌記錄的詳細說明，包括必要的 IAM 角色與政策，請參閱 CloudWatch Logs 文件中的 [Setting up a new cross-account subscription](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CrossAccountSubscriptions.html)。