

# 配置标准日志记录（v2）
<a name="standard-logging"></a>

您可以在创建或更新分配时启用访问日志（标准日志）。标准日志记录（v2）包括以下功能：
+ 将访问日志传输到 Amazon CloudWatch Logs、Amazon Data Firehose 和 Amazon Simple Storage Service（Amazon S3）。
+ 选择所需的日志字段。您也可以选择[实时访问日志字段的子集](#standard-logging-real-time-log-selection)。
+ 选择其他[输出日志文件](#supported-log-file-format)格式。

如果您使用 Amazon S3，则有以下可选功能：
+ 发送日志到选择的 AWS 区域。
+ 通过分区整理日志。
+ 启用与 Hive 兼容的文件名。

有关更多信息，请参阅 [将日志发送到 Amazon S3](#send-logs-s3)。

要开始使用标准日志记录，请完成以下步骤：

1. 为将接收您的日志的指定 AWS 服务 设置所需权限。

1. 使用 CloudFront 控制台或 CloudWatch API 配置标准日志记录。

1. 查看您的访问日志。

**注意**  
如果您启用标准日志记录（v2），这不会影响或更改标准日志记录（旧版）。对于您的分配，在使用标准日志记录（v2）之外，您还可以继续使用标准日志记录（旧版）。有关更多信息，请参阅 [配置标准日志记录（旧版）](standard-logging-legacy-s3.md)。
如果您已经启用了标准日志记录（旧版），并且想要启用在 Amazon S3 中进行标准日志记录（v2），我们建议您指定*不同*的 Amazon S3 存储桶，或在同一存储桶中使用*单独的路径*（例如，使用日志前缀或分区）。这可以帮助您跟踪哪些日志文件与哪个分配相关联，并防止日志文件相互覆盖。

## 权限
<a name="permissions-standard-logging"></a>

CloudFront 使用 CloudWatch 公开发布的日志来传输访问日志。为此，您需要具有指定 AWS 服务 的权限才能启用日志记录传输。

要查看在各个日志记录目标上需要的权限，请选择《Amazon CloudWatch Logs User Guide》**中的以下主题。
+ [CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs)
+ [Firehose](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-Firehose)
+ [Amazon S3](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-S3)

在您设置了日志记录目标上的权限后，您可以为分配启用标准日志记录。

**注意**  
CloudFront 支持向不同 AWS 账户（跨账户）发送访问日志。要启用跨账户传输，两个账户（您的账户和接收账户）都必须具有所需的权限。有关更多信息，请参阅[为跨账户传输启用标准日志记录](#enable-standard-logging-cross-accounts)一节或《Amazon CloudWatch Logs User Guide》**中的 [Cross-account delivery example](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#vended-logs-crossaccount-example)。

## 启用标准日志记录
<a name="set-up-standard-logging"></a>

要启用标准日志记录，您可以使用 CloudFront 控制台或 CloudWatch API。

**Contents**
+ [启用标准日志记录（CloudFront 控制台）](#access-logging-console)
+ [启用标准日志记录（CloudWatch API）](#enable-access-logging-api)

### 启用标准日志记录（CloudFront 控制台）
<a name="access-logging-console"></a>

**为 CloudFront 分配启用标准日志记录（控制台）**

1. 使用 CloudFront 控制台[更新现有分配](HowToUpdateDistribution.md#HowToUpdateDistributionProcedure)。

1. 选择**日志记录**选项卡。

1. 选择**添加**，然后选择要接收日志的服务：
   + CloudWatch Logs
   + Firehose
   + Amazon S3

1. 对于**目标**，选择您的服务的资源。如果您尚未创建资源，则可以选择**创建**或查看以下文档。
   + 对于 CloudWatch Logs，输入**[日志组名称](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)**。
   + 对于 Firehose，输入 **[Firehose 传输流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)**。
   + 对于 Amazon S3，输入**[存储桶名称](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)**。
**提示**  
要指定前缀，请在存储桶名称之后输入前缀，例如 `amzn-s3-demo-bucket.s3.amazonaws.com/MyLogPrefix`。如果您未指定前缀，CloudFront 会自动为您添加前缀。有关更多信息，请参阅 [将日志发送到 Amazon S3](#send-logs-s3)。

1. 对于**其他设置 – *可选***，您可以指定以下选项：

   1. 对于**字段选择**，请选择要传输到目标的日志字段名称。您可以选择[访问日志字段](standard-logs-reference.md#BasicDistributionFileFormat)以及[实时访问日志字段](#standard-logging-real-time-log-selection)的子集。

   1. （仅限 Amazon S3）对于**分区**，请指定日志文件数据分区的路径。

   1. （仅限 Amazon S3）对于**与 Hive 兼容的文件格式**，您可以选中复选框，使用与 Hive 兼容的 S3 路径。这有助于简化将新数据加载到与 Hive 兼容的工具中的过程。

   1. 对于**输出格式**，指定您偏好的格式。
**注意**  
如果您选择 **Parquet**，则需要将您的访问日志转换为 Apache Parquet，因而此选项会产生 CloudWatch 费用。有关更多信息，请参阅 [CloudWatch 定价中的“公开日志”部分](https://aws.amazon.com/cloudwatch/pricing/)。

   1. 在**字段分隔符**中，指定如何分隔日志字段。

1. 完成更新或创建分配的步骤。

1. 要添加其它目标，请重复步骤 3–6。

1. 在**日志**页面中，验证分配旁边的标准日志状态是否为**已启用**。

1. （可选）要启用 Cookie 日志记录，请选择**管理**、**设置**并开启 **Cookie 日志记录**，然后选择**保存更改**。
**提示**  
Cookie 日志记录是一项全局设置，应用到您的分配的*所有*标准日志记录。您不能为单独的传输目标覆盖此设置。

有关标准日志传输和日志字段的更多信息，请参阅[标准日志记录引用](standard-logs-reference.md)。

### 启用标准日志记录（CloudWatch API）
<a name="enable-access-logging-api"></a>

您还可以使用 CloudWatch API 来为分配启用标准日志记录。

**备注**  
在调用 CloudWatch API 以启用标准日志记录时，您必须指定美国东部（弗吉尼亚州北部）区域（`us-east-1`），即使您想要启用跨区域传输到其他目标也是如此。例如，如果您要将访问日志发送到欧洲地区（爱尔兰）区域的 S3 存储桶（`eu-west-1`），请使用 `us-east-1` 区域的中的 CloudWatch API。
系统还提供了一个选项，用于在标准日志记录中包含 Cookie。在 CloudFront API 中，这是 `IncludeCookies` 参数。如果您使用 CloudWatch API 配置访问日志并指定要包含 Cookie，则必须使用 CloudFront 控制台或 CloudFront API 来更新您的分配以包含 Cookie。否则，CloudFront 无法向您的日志目标发送 Cookie。有关更多信息，请参阅 [Cookie 日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesCookieLogging)。

**为分配启用标准日志记录（CloudWatch API）**

1. 在您创建分配之后，需要获取 Amazon 资源名称（ARN）。

   您可以在 CloudFront 控制台的**分配**页面中找到 ARN，也可以使用 [GetDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_GetDistribution.html) API 操作。分配 ARN 遵循以下格式：`arn:aws:cloudfront::123456789012:distribution/d111111abcdef8`

1. 接下来，使用 CloudWatch [PutDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html) API 操作为分配创建传输源。

   1. 输入传输源的名称。

   1. 传递分配的 `resourceArn`。

   1. 对于 `logType`，指定 `ACCESS_LOGS` 作为要收集的日志的类型。

   1.   
**Example AWS CLI put-delivery-source 命令示例**  

      以下示例为分配配置传输源。

      ```
      aws logs put-delivery-source --name S3-delivery --resource-arn arn:aws:cloudfront::123456789012:distribution/d111111abcdef8 --log-type ACCESS_LOGS
      ```

      **Output**

      ```
      {
       "deliverySource": {
       "name": "S3-delivery",
       "arn": "arn:aws:logs:us-east-1:123456789012:delivery-source:S3-delivery",
       "resourceArns": [
       "arn:aws:cloudfront::123456789012:distribution/d111111abcdef8"
       ],
       "service": "cloudfront",
       "logType": "ACCESS_LOGS"
       }
      }
      ```

1. 使用 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html) API 操作配置日志的存储位置。

   1. 对于 `destinationResourceArn`，指定目标的 ARN。这可以是 CloudWatch 日志组、Firehose 传输流或 Amazon S3 存储桶。

   1. 对于 `outputFormat`，请指定日志的输出格式。

   1.   
**Example AWS CLI put-delivery-destination 命令示例**  

      以下示例将传输目标配置为 Amazon S3 存储桶。

      ```
      aws logs put-delivery-destination --name S3-destination --delivery-destination-configuration destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket
      ```

      **Output**

      ```
      {
          "name": "S3-destination",
          "arn": "arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination",
          "deliveryDestinationType": "S3",
          "deliveryDestinationConfiguration": {
              "destinationResourceArn": "arn:aws:s3:::amzn-s3-demo-bucket"
          }
      }
      ```
**注意**  
如果您要跨账户传输日志，则必须使用 [PutDeliveryDestinationPolicy](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html) API 操作，将 AWS Identity and Access Management（IAM）策略分配到目标账户。IAM 策略支持将日志从一个账户传输到另一个账户。

1. 使用 [CreateDelivery](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html) API 操作，将传输源关联到您在前面的步骤中创建的目标。此 API 操作会将传输源与最终目标关联起来。

   1. 对于 `deliverySourceName`，指定源名称。

   1. 对于 `deliveryDestinationArn`，指定传输目标的 ARN。

   1. 对于 `fieldDelimiter`，指定用于分隔各日志字段的字符串。

   1. 对于 `recordFields`，指定所需的日志字段。

   1. 如果您使用 S3，请指定是否使用 `enableHiveCompatiblePath` 和 `suffixPath`。  
**Example AWS CLI create-delivery 命令示例**  

   以下示例创建传输。

   ```
   aws logs create-delivery --delivery-source-name cf-delivery --delivery-destination-arn arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination
   ```

   **Output**

   ```
   {
       "id": "abcNegnBoTR123",
       "arn": "arn:aws:logs:us-east-1:123456789012:delivery:abcNegnBoTR123",
       "deliverySourceName": "cf-delivery",
       "deliveryDestinationArn": "arn:aws:logs:us-east-1:123456789012:delivery-destination:S3-destination",
       "deliveryDestinationType": "S3",
       "recordFields": [
           "date",
           "time",
           "x-edge-location",
           "sc-bytes",
           "c-ip",
           "cs-method",
           "cs(Host)",
           "cs-uri-stem",
           "sc-status",
           "cs(Referer)",
           "cs(User-Agent)",
           "cs-uri-query",
           "cs(Cookie)",
           "x-edge-result-type",
           "x-edge-request-id",
           "x-host-header",
           "cs-protocol",
           "cs-bytes",
           "time-taken",
           "x-forwarded-for",
           "ssl-protocol",
           "ssl-cipher",
           "x-edge-response-result-type",
           "cs-protocol-version",
           "fle-status",
           "fle-encrypted-fields",
           "c-port",
           "time-to-first-byte",
           "x-edge-detailed-result-type",
           "sc-content-type",
           "sc-content-len",
           "sc-range-start",
           "sc-range-end",
           "c-country",
           "cache-behavior-path-pattern"
       ],
        "fieldDelimiter": ""
   }
   ```

1. 在 CloudFront 控制台的**日志**页面中，验证分配旁边的标准日志状态是否为**已启用**。

   有关标准日志传输和日志字段的更多信息，请参阅[标准日志记录引用](standard-logs-reference.md)。

**注意**  
要使用 AWS CloudFormation 为 CloudFront 启用标准日志记录（v2），您可以使用以下 CloudWatch Logs 属性：  
[Delivery](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-delivery.html)
[DeliveryDestination](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-deliverydestination.html)
[DeliverySource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-deliverysource.html)
`ResourceArn` 是 CloudFront 分配，`LogType` 必须是支持的日志类型的 `ACCESS_LOGS`。

## 为跨账户传输启用标准日志记录
<a name="enable-standard-logging-cross-accounts"></a>

如果您为 AWS 账户启用了标准日志记录功能，并且希望将访问日志传输到其它账户，请确保正确配置源账户和目标账户。CloudFront 分配的*源账户*将其访问日志发送到*目标账户*。

在此示例过程中，源账户（*111111111111*）将其访问日志发送到目标账户（*222222222222*）中的 Amazon S3 存储桶。要将访问日志发送到目标账户中的 Amazon S3 存储桶，请使用 AWS CLI。

### 配置目标账户
<a name="steps-destination-account"></a>

对于目标账户，请完成以下过程。

**配置目标账户**

1. 要创建日志传输目标，您可以输入以下 AWS CLI 命令。此示例使用 `MyLogPrefix` 字符串为您的访问日志创建前缀。

   ```
   aws logs put-delivery-destination --name cloudfront-delivery-destination --delivery-destination-configuration "destinationResourceArn=arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/MyLogPrefix"
   ```

   **Output**

   ```
   {
       "deliveryDestination": {
           "name": "cloudfront-delivery-destination",
           "arn": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination",
           "deliveryDestinationType": "S3",
           "deliveryDestinationConfiguration": {"destinationResourceArn": "arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/MyLogPrefix"}
       }
   }
   ```
**注意**  
如果您指定 S3 存储桶而*不带*前缀，CloudFront 会自动附加 `AWSLogs/<account-ID>/CloudFront` 作为前缀，该前缀显示在 S3 传输目标的 `suffixPath` 中。有关更多信息，请参阅 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html)。

1. 为日志传输目标添加资源策略，以允许源账户创建日志传输。

   在以下策略中，将 *111111111111* 替换为源账户 ID，并指定步骤 1 输出中的传输目标 ARN。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowCreateDelivery",
               "Effect": "Allow",
               "Principal": {"AWS": "111111111111"},
               "Action": ["logs:CreateDelivery"],
               "Resource": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination"
           }
       ]
   }
   ```

------

1. 保存文件，例如 `deliverypolicy.json`。

1. 要将之前的策略附加到传输目标，请输入以下 AWS CLI 命令。

   ```
   aws logs put-delivery-destination-policy --delivery-destination-name cloudfront-delivery-destination --delivery-destination-policy file://deliverypolicy.json
   ```

1. 将以下语句添加到目标 Amazon S3 存储桶策略中，替换资源 ARN 和源账户 ID。此策略允许 `delivery.logs.amazonaws.com` 服务主体执行 `s3:PutObject` 操作。

   ```
   {
       "Sid": "AWSLogsDeliveryWrite",
       "Effect": "Allow",
       "Principal": {"Service": "delivery.logs.amazonaws.com"},
       "Action": "s3:PutObject",
       "Resource": "arn:aws:s3:::amzn-s3-demo-bucket-cloudfront-logs/*",
       "Condition": {
           "StringEquals": {
               "s3:x-amz-acl": "bucket-owner-full-control",
               "aws:SourceAccount": "111111111111"
           },
           "ArnLike": {"aws:SourceArn": "arn:aws:logs:us-east-1:111111111111:delivery-source:*"}
       }
   }
   ```

1. 如果您为存储桶使用 AWS KMS，请在 KMS 密钥策略中添加以下语句，用于向 `delivery.logs.amazonaws.com` 服务主体授予权限。

   ```
   {
       "Sid": "Allow Logs Delivery to use the key",
       "Effect": "Allow",
       "Principal": {"Service": "delivery.logs.amazonaws.com"},
       "Action": [
           "kms:Encrypt",
           "kms:Decrypt",
           "kms:ReEncrypt*",
           "kms:GenerateDataKey*",
           "kms:DescribeKey"
       ],
       "Resource": "*",
       "Condition": {
           "StringEquals": {"aws:SourceAccount": "111111111111"},
           "ArnLike": {"aws:SourceArn": "arn:aws:logs:us-east-1:111111111111:delivery-source:*"}
       }
   }
   ```

### 配置源账户
<a name="steps-source-account"></a>

配置目标账户之后，请按照以下过程创建传输源，并在源账户中为分配启用日志记录。

**配置源账户**

1. 为 CloudFront 标准日志记录创建传输源，以便您可以将日志文件发送到 CloudWatch Logs。

   您可以输入以下 AWS CLI 命令，替换名称和您的分配 ARN。

   ```
   aws logs put-delivery-source --name s3-cf-delivery --resource-arn arn:aws:cloudfront::111111111111:distribution/E1TR1RHV123ABC --log-type ACCESS_LOGS
   ```

   **Output**

   ```
   {
       "deliverySource": {
           "name": "s3-cf-delivery",
           "arn": "arn:aws:logs:us-east-1:111111111111:delivery-source:s3-cf-delivery",
           "resourceArns": ["arn:aws:cloudfront::111111111111:distribution/E1TR1RHV123ABC"],
           "service": "cloudfront",
           "logType": "ACCESS_LOGS"
       }
   }
   ```

1. 创建传输，将源账户的日志传输源对应到目标账户的日志传输目标。

   在以下 AWS CLI 命令中，指定[步骤 1：配置目标账户](#steps-destination-account)的输出中的传输目标 ARN。

   ```
   aws logs create-delivery --delivery-source-name s3-cf-delivery --delivery-destination-arn arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination
   ```

   **Output**

   ```
   {
       "delivery": {
           "id": "OPmOpLahVzhx1234",
           "arn": "arn:aws:logs:us-east-1:111111111111:delivery:OPmOpLahVzhx1234",
           "deliverySourceName": "s3-cf-delivery",
           "deliveryDestinationArn": "arn:aws:logs:us-east-1:222222222222:delivery-destination:cloudfront-delivery-destination",
           "deliveryDestinationType": "S3",
           "recordFields": [
               "date",
               "time",
               "x-edge-location",
               "sc-bytes",
               "c-ip",
               "cs-method",
               "cs(Host)",
               "cs-uri-stem",
               "sc-status",
               "cs(Referer)",
               "cs(User-Agent)",
               "cs-uri-query",
               "cs(Cookie)",
               "x-edge-result-type",
               "x-edge-request-id",
               "x-host-header",
               "cs-protocol",
               "cs-bytes",
               "time-taken",
               "x-forwarded-for",
               "ssl-protocol",
               "ssl-cipher",
               "x-edge-response-result-type",
               "cs-protocol-version",
               "fle-status",
               "fle-encrypted-fields",
               "c-port",
               "time-to-first-byte",
               "x-edge-detailed-result-type",
               "sc-content-type",
               "sc-content-len",
               "sc-range-start",
               "sc-range-end",
               "c-country",
               "cache-behavior-path-pattern"
           ],
           "fieldDelimiter": "\t"
       }
   }
   ```

1. 验证跨账户传输是否成功。

   1. 从*源*账户，登录 CloudFront 控制台并选择您的分配。在**日志记录**选项卡的**类型**下，您将看到一个为 S3 跨账户日志传输创建的条目。

   1. 从*目标*账户，登录 Amazon S3 控制台，然后选择您的 Amazon S3 存储桶。在存储桶名称以及传输到该文件夹的所有访问日志中，您会看到前缀 `MyLogPrefix`。

## 输出文件格式
<a name="supported-log-file-format"></a>

根据选择的传输目标，您可以为日志文件指定下列格式之一：
+ JSON
+ 纯文本
+ w3c
+ Raw
+ Parquet（仅限 Amazon S3）

**注意**  
您只能在首次创建传输目标时设置输出格式。以后，无法对其进行更新。要更改输出格式，请删除传输并重新创建。

有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html)。

## 编辑标准日志记录设置
<a name="standard-logs-v2-edit-settings"></a>

您可以使用 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)或 CloudWatch API，来启用或禁用日志记录和更新其他日志设置。您对日志记录设置的更改将在 12 小时内生效。

有关更多信息，请参阅以下主题：
+ 要使用 CloudFront 控制台更新分配，请参阅[更新分配](HowToUpdateDistribution.md)。
+ 要使用 CloudFront API 更新分配，请参阅《Amazon CloudFront API Reference》**中的 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 有关 CloudWatch Logs API 操作的更多信息，请参阅[《Amazon CloudWatch Logs API Reference》](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/Welcome.html)。

## 访问日志字段
<a name="standard-logging-real-time-log-selection"></a>

您可以选择标准日志记录（旧版）支持的相同日志字段。有关更多信息，请参阅[日志文件字段](standard-logs-reference.md#BasicDistributionFileFormat)。

此外，您还可以选择以下[实时访问日志字段](real-time-logs.md#understand-real-time-log-config)。

1. `timestamp(ms)` – 时间戳，以毫秒为单位。

1. `origin-fbl` – CloudFront 与您的源之间第一字节延迟的秒数。

1. `origin-lbl` – CloudFront 与您的源之间最后一个字节延迟的秒数。

1. `asn` – 查看器的自治系统编号（ASN）。

1. `c-country` – 表示查看器的地理位置的国家/地区代码，由查看器的 IP 地址决定。有关国家/地区代码的列表，请参阅 [ISO 3166-1 alpha-2](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)。

1. `cache-behavior-path-pattern` – 标识与查看器请求匹配的缓存行为的路径模式。

## 将日志发送到 CloudWatch Logs
<a name="send-logs-cloudwatch-logs"></a>

要向 CloudWatch Logs 发送日志，请创建或使用现有的 CloudWatch Logs 日志组。有关配置 CloudWatch Logs 日志组的更多信息，请参阅[使用日志组和日志流](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html)。

创建日志组后，您必须具有所需的权限来启用标准日志记录。有关所需权限的更多信息，请参阅《**Amazon CloudWatch Logs User Guide》中的 [Logs sent to CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs)。

**备注**  
在您指定 CloudWatch Logs 日志组的名称时，请仅使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。
确认您的日志组资源策略未超过大小限制。请参阅 CloudWatch Logs 主题中的 [Log group resource policy size limit considerations](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-CloudWatchLogs) 部分。

### 将访问日志发送到 CloudWatch Logs 示例
<a name="example-access-logs-cwl"></a>

```
{ 
"date": "2024-11-14", 
"time": "21:34:06", 
"x-edge-location": "SOF50-P2", 
"asn": "16509", 
"timestamp(ms)": "1731620046814", 
"origin-fbl": "0.251", 
"origin-lbl": "0.251", 
"x-host-header": "d111111abcdef8.cloudfront.net", 
"cs(Cookie)": "examplecookie=value" 
}
```

## 发送日志至 Firehose
<a name="send-logs-kinesis"></a>

要将日志发送到 Firehose，请创建或使用现有的 Firehose 传输流。然后，将 Firehose 传输流指定为日志传输目标。您必须在美国东部（弗吉尼亚州北部）us-east-1 区域中指定一个 Firehose 传输流。

有关创建传输流的信息，请参阅[创建 Amazon Data Firehose 传输流](https://docs.aws.amazon.com/firehose/latest/dev/basic-create.html)。

创建传输流之后，您必须具有所需的权限来启用标准日志记录。有关的更多信息，请参阅**《Amazon CloudWatch Logs User Guide》中的 [Logs sent to Firehose](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-Firehose)。

**注意**  
在您指定 Firehose 流的名称时，请仅使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。

### 将日志发送到 Firehose 示例
<a name="example-access-logs-firehose"></a>

```
{"date":"2024-11-15","time":"19:45:51","x-edge-location":"SOF50-P2","asn":"16509","timestamp(ms)":"1731699951183","origin-fbl":"0.254","origin-lbl":"0.254","x-host-header":"d111111abcdef8.cloudfront.net","cs(Cookie)":"examplecookie=value"}
{"date":"2024-11-15","time":"19:45:52","x-edge-location":"SOF50-P2","asn":"16509","timestamp(ms)":"1731699952950","origin-fbl":"0.125","origin-lbl":"0.125","x-host-header":"d111111abcdef8.cloudfront.net","cs(Cookie)":"examplecookie=value"}
```

## 将日志发送到 Amazon S3
<a name="send-logs-s3"></a>

要将访问日志发送到 Amazon S3，请创建或使用现有 S3 存储桶。当您在 CloudFront 中启用日志记录时，请指定存储桶名称。有关创建存储桶的信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

创建存储桶之后，您必须具有所需的权限来启用标准日志记录。有关的更多信息，请参阅《Amazon CloudWatch Logs 用户指南》中的 [发送到 Amazon S3 的日志](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html#AWS-logs-infrastructure-V2-S3)**。
+ 启用日志记录后，AWS 会自动为您添加所需的存储桶策略。
+ 您还可以使用[所选 AWS 区域](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html) 中的 S3 存储桶。

**注意**  
如果您已经启用了标准日志记录（旧版），并且想要启用在 Amazon S3 中进行标准日志记录（v2），我们建议您指定*不同*的 Amazon S3 存储桶，或在同一存储桶中使用*单独的路径*（例如，使用日志前缀或分区）。这可以帮助您跟踪哪些日志文件与哪个分配相关联，并防止日志文件相互覆盖。

**Topics**
+ [指定 S3 存储桶](#prefix-s3-buckets)
+ [分区](#partitioning)
+ [与 Hive 兼容的文件名格式](#hive-compatible-file-name-format)
+ [访问日志的路径示例](#bucket-path-examples)
+ [发送到 Amazon S3 的访问日志示例](#example-access-logs-s3)

### 指定 S3 存储桶
<a name="prefix-s3-buckets"></a>

在指定 S3 存储桶作为传输目标时，请注意以下几点。

S3 存储桶名称只能使用正则表达式模式 `[\w-]`。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [PutDeliveryDestination](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html#API_PutDeliveryDestination_RequestSyntax) API 操作。

如果您为 S3 存储桶指定了前缀，则您的日志将出现在该路径下。如果您未指定前缀，CloudFront 会自动为您附加 `AWSLogs/{account-id}/CloudFront` 前缀。

有关更多信息，请参阅 [访问日志的路径示例](#bucket-path-examples)。

### 分区
<a name="partitioning"></a>

当 CloudFront 将访问日志发送到您的 S3 存储桶时，您可以使用分区来整理这些日志。这让您可以按照所需的路径组织和查找访问日志。

您可以使用以下变量来创建文件夹路径。
+ `{DistributionId}` 或 `{distributionid}`
+ `{yyyy}`
+ `{MM}`
+ `{dd}`
+ `{HH}`
+ `{accountid}`

您可以使用任意数量的变量，还可以在路径中指定文件夹名称。然后，CloudFront 使用此路径在 S3 存储桶中为您创建文件夹结构。

**示例**
+ `my_distribution_log_data/{DistributionId}/logs`
+ `/cloudfront/{DistributionId}/my_distribution_log_data/{yyyy}/{MM}/{dd}/{HH}/logs `

**注意**  
 可以在后缀路径中将任一变量用于分配 ID。但是，如果您要向 AWS Glue 发送访问日志，则必须使用 `{distributionid}` 变量，因为 AWS Glue 要求分区名称必须为小写。更新 CloudFront 中的现有日志配置，以便将 `{DistributionId}` 替换为 `{distributionid}`。

### 与 Hive 兼容的文件名格式
<a name="hive-compatible-file-name-format"></a>

您可以使用此选项，这样包含所传输访问日志的 S3 对象会使用允许与 Apache Hive 集成的前缀结构。有关更多信息，请参阅 [CreateDelivery](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html) API 操作。

**Example 示例**  

```
/cloudfront/DistributionId={DistributionId}/my_distribution_log_data/year={yyyy}/month={MM}/day={dd}/hour={HH}/logs
```

有关分区和与 Hive 兼容的选项，请参阅《Amazon CloudWatch Logs API Reference》**中的 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html) 元素。

### 访问日志的路径示例
<a name="bucket-path-examples"></a>

在指定 S3 存储桶作为目标时，您可以使用以下选项来创建访问日志的路径：
+ Amazon S3 存储桶，带或不带前缀
+ 分区，使用 CloudFront 提供的变量或输入您自己的分区
+ 启用与 Hive 兼容选项

下表根据您选择的选项，显示访问日志出现在存储桶中的方式。

#### 带前缀的 Amazon S3 存储桶
<a name="bucket-with-prefix"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket/MyLogPrefix | 无 | 无 | 否 | amzn-s3-demo-bucket/MyLogPrefix/ | 
| amzn-s3-demo-bucket/MyLogPrefix | myFolderA/ | myFolderA/ | 否 | amzn-s3-demo-bucket/MyLogPrefix/myFolderA/ | 
| amzn-s3-demo-bucket/MyLogPrefix | myFolderA/\$1yyyy\$1 | myFolderA/\$1yyyy\$1 | 是 | amzn-s3-demo-bucket/MyLogPrefix/myFolderA/year=2025 | 

#### 不带前缀的 Amazon S3 存储桶
<a name="bucket-without-prefix"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket | 无 | AWSLogs/\$1account-id\$1/CloudFront/ | 否 | amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/ | 
| amzn-s3-demo-bucket | myFolderA/ | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/ | 否 | amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/myFolderA/ | 
| amzn-s3-demo-bucket | myFolderA/ | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/ | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/ | 
| amzn-s3-demo-bucket | myFolderA/\$1yyyy\$1 | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/\$1yyyy\$1 | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/year=2025 | 

#### AWS 账户 ID 作为分区
<a name="bucket-account-id-partition"></a>


| Amazon S3 存储桶名称 | 您在后缀路径中指定的分区 | 更新的后缀路径 | 是否启用了与 Hive 兼容？ | 访问日志发送至 | 
| --- | --- | --- | --- | --- | 
| amzn-s3-demo-bucket | 无 | AWSLogs/\$1account-id\$1/CloudFront/ | 支持 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/ | 
| amzn-s3-demo-bucket | myFolderA/\$1accountid\$1 | AWSLogs/\$1account-id\$1/CloudFront/myFolderA/\$1accountid\$1 | 是 | amzn-s3-demo-bucket/AWSLogs/aws-account-id=<your-account-ID>/CloudFront/myFolderA/accountid=<your-account-ID> | 

**备注**  
`{account-id}` 变量是 CloudFront 的保留变量。如果您指定*不带*前缀的 Amazon S3 存储桶，CloudFront 会自动将此变量添加到您的后缀路径中。如果您的日志与 Hive 兼容，则此变量显示为 `aws-account-id`。
您可以使用 `{accountid}` 变量，让 CloudFront 将您的账户 ID 添加到后缀路径中。如果您的日志与 Hive 兼容，则此变量显示为 `accountid`。
有关后缀路径的更多信息，请参阅 [S3DeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_S3DeliveryConfiguration.html)。

### 发送到 Amazon S3 的访问日志示例
<a name="example-access-logs-s3"></a>

```
#Fields: date time x-edge-location asn timestamp(ms) x-host-header cs(Cookie)
2024-11-14    22:30:25    SOF50-P2    16509    1731623425421    
d111111abcdef8.cloudfront.net    examplecookie=value2
```

## 禁用标准日志记录
<a name="delete-standard-log-destination"></a>

如果您不再需要标准日志记录，可以在分配上禁用日志记录。

**禁用标准日志记录**

1. 登录 CloudFront 控制台。

1. 选择**分配**，然后选择您的分配 ID。

1. 选择**日志记录**，然后在**访问日志目标**下选择目标。

1. 选择**管理**，然后选择**删除**。

1. 如果您有多个标准日志记录，请重复上一步操作。

**注意**  
当您从 CloudFront 控制台中删除标准日志记录时，此操作仅删除传输和传输目标。它不会从您的 AWS 账户中删除传输源。要删除传输源，请在 `aws logs delete-delivery-source --name DeliverySourceName` 命令中指定传输源名称。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [DeleteDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteDeliverySource.html)。

## 故障排除
<a name="troubleshooting-access-logs-v2"></a>

当您使用 CloudFront 标准日志记录（v2）时，可以使用以下信息来修复常见问题。

### 传输源已存在
<a name="access-logging-resource-already-used"></a>

在为分配启标准日志记录时，您会创建传输源。然后，您可以使用该传输源，来创建对所需的目标类型的传输：CloudWatch Logs、Firehose、Amazon S3。目前，每个分配只能有一个传输源。如果您尝试为同一个分配创建其他传输源，则会显示以下错误消息。

```
This ResourceId has already been used in another Delivery Source in this account
```

要创建其他传输源，请先删除现有的传输源。有关更多信息，请参阅《Amazon CloudWatch Logs API Reference》**中的 [DeleteDeliverySource](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteDeliverySource.html)。

### 我更改了后缀路径，但 Amazon S3 存储桶无法接收我的日志
<a name="access-logging-s3-permission"></a>

如果您启用了标准日志记录（v2）并指定了不带前缀的存储桶 ARN，CloudFront 将在后缀路径后附加以下默认值：`AWSLogs/{account-id}/CloudFront`。如果您使用 CloudFront 控制台或 [UpdateDeliveryConfiguration](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html) API 操作来指定不同的后缀路径，则必须更新 Amazon S3 存储桶策略来使用相同的路径。

**Example 示例：更新后缀路径**  

1. 默认后缀路径是 `AWSLogs/{account-id}/CloudFront`，但您可以将其替换为 `myFolderA`。

1. 由于新的后缀路径与在 Amazon S3 存储桶策略中指定的路径不同，因此不会传输您的访问日志。

1. 您可以执行以下步骤之一：
   + 将 Amazon S3 存储桶权限从 `amzn-s3-demo-bucket/AWSLogs/<your-account-ID>/CloudFront/*` 更新为 `amzn-s3-demo-bucket/myFolderA/*`。
   + 更新日志记录配置，以便再次使用默认后缀：`AWSLogs/{account-id}/CloudFront`
有关更多信息，请参阅 [权限](#permissions-standard-logging)。

## 删除日志文件
<a name="standard-logs-v2-delete"></a>

CloudFront 不会自动删除目标中的日志文件。有关删除日志文件的信息，请参阅以下主题：

**Amazon S3**
+ 《Amazon Simple Storage Service 控制台用户指南》**中的[删除对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjects.html)

**CloudWatch Logs**
+ **《Amazon CloudWatch Logs User Guide》中的 [Working with log groups and log streams](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html) 
+ 《**Amazon CloudWatch Logs API Reference》中的 [DeleteLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteLogGroup.html)

**Firehose**
+ 《**Amazon Data Firehose API Reference》中的 [DeleteDeliveryStream](https://docs.aws.amazon.com/firehose/latest/APIReference/API_DeleteDeliveryStream.html)

## 定价
<a name="pricing-standard-logs"></a>

对于启用标准日志，CloudFront 不收取任何费用。但是，根据您选择的日志传输目标，可能会产生传输、摄取、存储或访问费用。有关更多信息，请参阅 [Amazon CloudWatch Logs 定价](https://aws.amazon.com/cloudwatch/pricing/)。在**付费套餐**下，选择**日志**选项卡，然后在**公开发布的日志**下，查看每个传输目标的信息。

有关每项 AWS 服务 服务定价的更多信息，请参阅以下主题：
+ [Amazon CloudWatch Logs 定价](https://aws.amazon.com/cloudwatch/pricing/)
+ [Amazon Data Firehose 定价](https://aws.amazon.com/kinesis/data-firehose/pricing/)
+ [Amazon S3 定价](https://aws.amazon.com/s3/pricing/) 
**注意**  
日志传输到 Amazon S3 不会产生额外费用，但存储和访问日志文件将产生 Amazon S3 费用。如果您启用 **Parquet** 选项将您的访问日志转换为 Apache Parquet，则此选项会产生 CloudWatch 费用。有关更多信息，请参阅 [CloudWatch 定价中的“公开日志”部分](https://aws.amazon.com/cloudwatch/pricing/)。