

# 为 API Gateway 中的 HTTP API 配置日志记录
<a name="http-api-logging"></a>

您可以开启日志记录以将日志写入 CloudWatch Logs。您可以使用[日志记录变量](http-api-logging-variables.md)来自定义日志的内容。

为了改善安全状况，我们建议您将 HTTP API 的所有阶段的日志写入 CloudWatch Logs。为遵守各种合规性框架，您可能需要执行此操作。有关更多信息，请参阅《AWS Security Hub User Guide》**中的 [Amazon API Gateway Controls](https://docs.aws.amazon.com/securityhub/latest/userguide/apigateway-controls.html)。

要为 HTTP API 开启日志记录，您必须执行以下操作。

1. 确保您的用户具有激活日志记录所需的权限。

1. 创建 CloudWatch Logs 日志组。

1. 为 API 的某个阶段提供 CloudWatch Logs 日志组的 ARN。

## 激活日志记录的权限
<a name="http-api-logging.permissions"></a>

要开启 API 的日志记录，您的用户必须具有以下权限。

**Example**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:DescribeLogGroups",
                "logs:DescribeLogStreams",
                "logs:GetLogEvents",
                "logs:FilterLogEvents"
            ],
            "Resource": "arn:aws:logs:{{us-east-2}}:{{123456789012}}:log-group:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogDelivery",
                "logs:PutResourcePolicy",
                "logs:UpdateLogDelivery",
                "logs:DeleteLogDelivery",
                "logs:CreateLogGroup",
                "logs:DescribeResourcePolicies",
                "logs:GetLogDelivery",
                "logs:ListLogDeliveries"
            ],
            "Resource": "*"
        }
    ]
}
```

## 创建日志组并激活 HTTP API 的日志记录
<a name="http-api-enable-logging"></a>

您可以使用 AWS 管理控制台 或 AWS CLI 创建日志组并激活访问日志记录。

------
#### [ AWS 管理控制台 ]

1.  创建日志组。

   要了解如何使用控制台建立日志组，请参阅[《Amazon CloudWatch Logs 用户指南》中的“创建日志组”](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择 HTTP API。

1. 在主导航面板的 **Monitor**（监控）选项卡下，选择 **Logging**（日志记录）。

1. 选择要激活日志记录的阶段，然后选择 **Select**（选择）。

1. 选择 **Edit**（编辑）以激活访问日志。

1. 开启 **Access logging**（访问日志），进入 CloudWatch Logs，然后选择日志格式。

1. 选择**保存**。

------
#### [ AWS CLI ]

以下 [create-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/create-log-group.html) 命令创建日志组：

```
aws logs create-log-group --log-group-name {{my-log-group}}
```

您需要日志组的 Amazon 资源名称（ARN）才能开启日志记录。ARN 格式为 arn:aws:logs:{{region}}:{{account-id}}:log-group:{{log-group-name}}。

以下 [update-stage](https://docs.aws.amazon.com/cli/latest/reference/apigatewayv2/update-stage.html) 命令为 HTTP API 的 `$default` 阶段开启日志记录：

```
aws apigatewayv2 update-stage --api-id {{abcdef}} \
    --stage-name '{{$default}}' \
    --access-log-settings '{"DestinationArn": "arn:aws:logs:{{region}}:{{account-id}}:log-group:{{log-group-name}}", "Format": "$context.identity.sourceIp - - [$context.requestTime] \"$context.httpMethod $context.routeKey $context.protocol\" $context.status $context.responseLength $context.requestId"}'
```

------

## 日志格式示例
<a name="http-api-enable-logging.examples"></a>

一些常用的访问日志格式的示例在 API Gateway 控制台中显示，下面列出了这些格式。
+ `CLF` ([常用日志格式](https://httpd.apache.org/docs/current/logs.html#common) )：

  ```
  $context.identity.sourceIp - - [$context.requestTime] "$context.httpMethod $context.routeKey $context.protocol" $context.status $context.responseLength $context.requestId $context.extendedRequestId
  ```
+  `JSON`: 

  ```
  { "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod","routeKey":"$context.routeKey", "status":"$context.status","protocol":"$context.protocol", "responseLength":"$context.responseLength", "extendedRequestId": "$context.extendedRequestId" }
  ```
+ `XML`: 

  ```
  <request id="$context.requestId"> <ip>$context.identity.sourceIp</ip> <requestTime>$context.requestTime</requestTime> <httpMethod>$context.httpMethod</httpMethod> <routeKey>$context.routeKey</routeKey> <status>$context.status</status> <protocol>$context.protocol</protocol> <responseLength>$context.responseLength</responseLength> <extendedRequestId>$context.extendedRequestId</extendedRequestId> </request>
  ```
+ `CSV`（逗号分隔值）：

  ```
  $context.identity.sourceIp,$context.requestTime,$context.httpMethod,$context.routeKey,$context.protocol,$context.status,$context.responseLength,$context.requestId,$context.extendedRequestId
  ```