

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

# Amazon CloudWatch Logs 中的 Web 函數日誌
<a name="web-functions-logging"></a>

AWS Lambda 會擷取應用程式寫入標準輸出和標準錯誤的所有內容，並將其傳送至 Amazon CloudWatch Logs，以及 Lambda 本身產生的系統日誌。在 中Node.js，會自動擷取來自每個`console`方法的輸出，例如 `console.log`、 `console.info`和 `console.error`，並依 `applicationLogLevel`設定篩選。也會擷取寫入標準輸出或標準錯誤的記錄程式庫。您不需要記錄代理程式或 Amazon CloudWatch Logs SDK。

Lambda 會將`console`輸出寫入為 JSON 日誌事件`endpointName`，並將 `requestId`、 和 `region` 欄位新增至每個事件。如需範例，請參閱 [撰寫結構化日誌](#web-functions-logging-structured)。

Lambda 會在 Web 函數執行 AWS 區域 的每個 中收集日誌，然後將它們集中到函數的主區域。`HomeRegion` 端點僅在主區域中執行。`MultiRegion` 或 `PerRegion`端點也會在您指定的其他區域中執行，因此 Lambda 會集中每個區域的日誌。如需詳細資訊，請參閱[端點類型](web-functions-endpoints.md#web-functions-endpoint-types)。

## 日誌群組
<a name="web-functions-logging-log-groups"></a>

根據預設，Lambda 會將 Web 函數的日誌傳送至以函數命名的日誌群組：

```
/aws/lambda/web/{{function-name}}
```

除了集中式日誌群組之外，Lambda 還會使用配套日誌群組，在集中式日誌之前保留區域內日誌。配套名稱是集中式日誌群組的名稱，後面接著 `.local`，適用於預設日誌群組和自訂日誌群組。對於預設日誌群組，配套為：

```
/aws/lambda/web/{{function-name}}.local
```

Lambda 會將日誌寫入請求執行的每個區域中的`.local`日誌群組，包括主要區域，然後將它們集中到日誌群組中，而不會在主要區域中加上尾碼。每個`.local`日誌群組只會保留自己區域中的日誌。在集中化之後，Lambda 不會從`.local`日誌群組中移除事件。日誌群組的保留設定會決定它們的保留時間。

在您的 Web 函數提供其第一個請求之前，日誌群組不存在。主區域中的集中式日誌群組可能會出現在`.local`日誌群組之後。如需集中計時，請參閱 [集中式延遲](web-functions-monitoring.md#web-functions-monitoring-delays)。

Lambda 會使用預設 Amazon CloudWatch Logs 設定建立預設日誌群組和每個`.local`日誌群組，因此除非您設定保留政策，否則其事件永遠不會過期。您可以在 Lambda 建立它們之後變更其保留、加密和資源政策。在端點執行的每個區域中的`.local`日誌群組上設定這些項目，並在主區域中的集中式日誌群組上設定這些項目。

由於`.local`日誌群組不會等待集中化，因此對於偵錯特定區域中的問題非常有用。集中式日誌群組會保留每個區域的日誌，因此建置共用查詢、訂閱篩選條件、指標篩選條件和自動化，這些都必須涵蓋集中式日誌群組上的整個應用程式。如需了解遙測在每個區域中的行為，請參閱 [每個區域中的遙測](web-functions-monitoring.md#web-functions-monitoring-replica-telemetry)。

## 使用自訂日誌群組
<a name="web-functions-logging-custom-group"></a>

您可以將 Web 函數的日誌傳送至您選擇的日誌群組，而非預設值。當您想要在第一個日誌事件到達之前就備妥保留、加密或資源政策時，請使用自訂日誌群組。自訂日誌群組也可讓您將來自數個函數的日誌分組在一起。若要從頭開始套用這些設定，請先自行建立日誌群組及其`.local`配套，再將流量路由至修訂版。如果任一日誌群組不存在，Lambda 會在第一次使用時以預設設定建立日誌群組，之後可以更新其設定。只有在執行角色具有建立日誌群組的許可時，Lambda 才能建立日誌群組。如要了解必要的許可，請參閱 [執行角色](web-functions-permissions.md#web-functions-permissions-execution-role)。

**將日誌傳送至自訂日誌群組 (AWS CLI)**

1. 在主區域中，建立日誌群組及其`.local`配套，並設定您想要的保留。對於 `MultiRegion`或 `PerRegion`端點，也透過執行將 `--region`設定為該區域的`.local`命令，在端點提供服務的另一個區域中建立`.local`日誌群組。

   ```
   aws logs create-log-group --log-group-name {{/my-app/web-logs}}
   aws logs create-log-group --log-group-name {{/my-app/web-logs}}.local
   
   aws logs put-retention-policy \
       --log-group-name {{/my-app/web-logs}} \
       --retention-in-days 30
   
   aws logs put-retention-policy \
       --log-group-name {{/my-app/web-logs}}.local \
       --retention-in-days 30
   ```

1. 在 的 `telemetryConfig`區段中建立指定日誌群組的修訂`serviceConfig`。

   ```
   aws lambda-web create-web-function-revision \
       --function-name {{my-web-app}} \
       --build-config '{
         "codeConfig": {
           "s3Object": { "bucket": "{{my-bucket}}", "key": "{{my-app.zip}}" }
         },
         "runtimeConfig": { "runtime": "nodejs24.x" }
       }' \
       --service-config '{
         "executionRoleArn": "arn:aws:iam::{{111122223333}}:role/{{my-web-function-role}}",
         "telemetryConfig": {
           "loggingConfig": {
             "logGroup": "{{/my-app/web-logs}}"
           }
         }
       }'
   ```

1. 將流量路由到新的修訂版。如需詳細資訊，請參閱[部署模式](web-functions-deployment.md)。

由於記錄組態是修訂版的一部分，因此該修訂版是不可變的。若要稍後變更日誌群組，請建立另一個修訂。如需詳細資訊，請參閱[管理 Web 函數修訂](web-functions-revisions.md)。

## 記錄控制項
<a name="web-functions-logging-format-levels"></a>

`loggingConfig` 區段控制日誌的目的地和最低嚴重性。這些設定是修訂版的一部分。


| 設定 | 值 | 預設 | 說明 | 
| --- | --- | --- | --- | 
| logGroup | 日誌群組名稱 | /aws/lambda/web/{{function-name}} | 接收日誌的 Amazon CloudWatch Logs 日誌群組。 | 
| applicationLogLevel | TRACE \| DEBUG \| INFO \| WARN \| ERROR \| FATAL | INFO | Lambda 傳送至 Amazon CloudWatch Logs 的應用程式日誌的最低嚴重性。低於此層級的日誌會被捨棄。 Node.js 沒有FATAL主控台方法，因此 層級FATAL的行為會做為 ERROR。 | 
| systemLogLevel | DEBUG \| INFO \| WARN | INFO | Lambda 傳送給 Amazon CloudWatch Logs 的 Lambda 產生系統日誌的最低嚴重性。如需每個系統事件的層級，請參閱 [系統日誌](#web-functions-logging-system-logs)。 | 

下列範例會建立將應用程式日誌捨棄至 以下的修訂`WARN`：

```
aws lambda-web create-web-function-revision \
    --function-name {{my-web-app}} \
    --build-config '{
      "codeConfig": {
        "s3Object": { "bucket": "{{my-bucket}}", "key": "{{my-app.zip}}" }
      },
      "runtimeConfig": { "runtime": "nodejs24.x" }
    }' \
    --service-config '{
      "executionRoleArn": "arn:aws:iam::{{111122223333}}:role/{{my-web-function-role}}",
      "telemetryConfig": {
        "loggingConfig": {
          "applicationLogLevel": "WARN",
          "systemLogLevel": "INFO"
        }
      }
    }'
```

`applicationLogLevel` 提高生產量可同時降低日誌量和成本。當您調查問題`TRACE`時，將其暫時降低至 `DEBUG`或 。

## 系統日誌
<a name="web-functions-logging-system-logs"></a>

除了應用程式的輸出之外，您的日誌群組也會接收 Lambda 針對執行環境生命週期產生的系統日誌，例如環境初始化和關閉。使用 `systemLogLevel` 控制此 Lambda 發出的量。

系統日誌有助於將應用程式行為與平台事件建立關聯。例如，與環境初始化項目相符的延遲尖峰會指向冷啟動，而不是您的應用程式程式碼。如需這些日誌描述的生命週期，請參閱 [執行環境生命週期](web-functions-env-lifecycle.md)。

Web 函數會發出下列系統事件。`systemLogLevel` 設定為您需要的最低層級。例如，將其設定為 `DEBUG`以接收 `platform.requestComplete`，或設定為 `WARN` 以僅接收失敗和捨棄日誌警告。


| 事件類型 | Level | 備註 | 
| --- | --- | --- | 
| platform.initStart | INFO | 無 | 
| platform.initReport | INFO 成功時、失敗WARN時 | 失敗表示初始化錯誤，例如匯入程式碼時發生錯誤。 | 
| platform.invokeStart | INFO | 無 | 
| platform.requestComplete | DEBUG | 每個 HTTP 請求發出一次，包括失敗的請求。由於磁碟區很大，因此不會在預設系統日誌層級發出。 | 
| platform.invokeSummary | INFO | 定期。每個作用中執行環境大約每 60 秒發出一次。 | 
| platform.invokeReport | INFO 成功時、失敗WARN時 |  | 
| platform.spinDownStart | INFO |  | 
| platform.spinDownReport | INFO 成功時、失敗WARN時 | 失敗表示您的應用程式未在收到 SIGTERM(Runtime.SpinDownTimeout) 的 1 秒內結束，或因錯誤 () 而結束Runtime.ExitError。 | 
| platform.logsDropped | WARN | 指出 Lambda 已捨棄日誌事件。 | 

如需每個系統事件中的欄位，請參閱 [Lambda Web 函數的系統日誌事件結構描述](web-functions-logging-system-log-schema.md)。

`lambda-web-request-id` 回應標頭識別請求，`lambda-web-logstream`回應標頭識別處理請求之環境的日誌串流。使用這些值將用戶端回應與應用程式和系統日誌建立關聯。如需詳細資訊，請參閱[回應標頭](web-functions-http.md#web-functions-http-response-headers)。

若要在主區域的集中式日誌群組中尋找來自已識別日誌串流的事件，請依串流名稱篩選為字首。您也可以從提供請求的區域中的`.local`日誌群組讀取串流的確切名稱。

```
aws logs filter-log-events \
    --log-group-name /aws/lambda/web/{{my-web-app}} \
    --log-stream-name-prefix "{{LAMBDA_WEB_LOGSTREAM}}" \
    --region {{us-east-1}}
```

若要在重現問題時遵循最近的日誌，請使用：

```
aws logs tail /aws/lambda/web/{{my-web-app}} \
    --follow \
    --region {{us-east-1}}
```

## 撰寫結構化日誌
<a name="web-functions-logging-structured"></a>

將物件傳遞至 `console`方法，讓 Lambda 在 `message` 欄位中將其寫入為 JSON 物件。然後，您可以在 Amazon CloudWatch Logs Insights 中查詢個別欄位，而不是在子字串上進行比對。請勿傳遞您使用 建置的字串`JSON.stringify`。Lambda 將字串寫入為逸出字串值，因此無法查詢其欄位。

```
function logRequest(req, statusCode, durationMs) {
  console.info({
    method: req.method,
    path: req.url,
    statusCode: statusCode,
    durationMs: durationMs
  });
}
```

Lambda 會撰寫類似下列的日誌事件：

```
{
  "timestamp": "2026-09-25T11:29:02.711Z",
  "level": "INFO",
  "message": {
    "method": "GET",
    "path": "/hello-world",
    "statusCode": 200,
    "durationMs": 100
  },
  "requestId": "US3NHLM77IRXDFLBADYHGIZZNM",
  "endpointName": "prod",
  "region": "us-east-1"
}
```

然後，您可以直接查詢欄位。例如，下列 Amazon CloudWatch Logs Insights 查詢會傳回最近 20 個傳回 5xx 狀態的請求：

```
fields @timestamp, message.method, message.path, message.statusCode, message.durationMs
| filter message.statusCode >= 500
| sort @timestamp desc
| limit 20
```

若要從日誌發佈自訂指標，而不是只查詢它們，請使用內嵌指標格式。如需詳細資訊，請參閱[使用內嵌指標格式發佈自訂指標](web-functions-emf.md)。

## 將 Amazon CloudWatch Logs 功能與 日誌搭配使用
<a name="web-functions-logging-cwl-features"></a>

由於日誌集中到主要區域，因此您可以使用該區域中的標準 Amazon CloudWatch Logs 功能，包括：
+ **Live Tail** – 在您重現問題時串流日誌事件的抵達時間。事件會在集中化後到達集中式日誌群組，因此對於最短的延遲，請在提供請求的區域中的`.local`日誌群組上執行 Live Tail。
+ **Logs Insights** – 查詢 JSON 日誌事件中的欄位。
+ **日誌集中 –** 如果您彙總函數帳戶外的日誌，請使用 Amazon CloudWatch Logs 集中功能將您的日誌轉送到另一個帳戶或目的地。
+ **訂閱篩選條件和指標篩選條件 – **觸發下游處理或從日誌模式衍生指標。

將必須涵蓋整個應用程式的功能套用至主區域中的集中式日誌群組。`.local` 日誌群組只會保留自己區域中的日誌。如需詳細資訊，請參閱[每個區域中的遙測](web-functions-monitoring.md#web-functions-monitoring-replica-telemetry)。