

# 访问日志（标准日志）
<a name="AccessLogs"></a>

您可以配置 CloudFront 使其创建日志文件，其中包含有关 CloudFront 接收的每个用户（查看器）请求的详细信息。这些日志称为*访问日志*，也称为*标准日志*。

每个日志都包含各种信息，例如，收到请求的时间、处理时间、请求路径和服务器响应。您可以使用这些访问日志来分析服务性能和排查问题。

下图显示了 CloudFront 如何记录有关对您的对象的请求的信息。在本示例中，分配配置为将访问日志发送到 Amazon S3 存储桶。

![\[访问日志的基本流程\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudFront/latest/DeveloperGuide/images/Logging.png)


1. 在此示例中，您有 A 和 B 两个网站，以及两个对应的 CloudFront 分配。用户使用与您的分配相关联的 URL 来请求您的对象。

1. CloudFront 会将每个请求路由到适当的边缘站点。

1. CloudFront 将每个请求的数据写入分配特定的日志文件。在本示例中，与分配 A 相关的请求信息将写入分配 A 的日志文件，与分配 B 相关的请求信息将写入分配 B 的日志文件。

1. CloudFront 会定期将有关分配的日志文件保存在您启用日志记录时指定的 Amazon S3 存储桶。然后，CloudFront 开始将有关后续请求的信息保存在关于该分配的新日志文件中。

   如果在给定时间内没有查看器访问您的内容，您在该时间内不会接收任何日志文件。

**注意**  
建议您使用日志来了解内容的请求性质，而不是作为所有请求的完整描述。CloudFront 将尽力提供访问日志。特定请求的日志条目可能会在实际处理该请求之后很久才进行传输，而且极少数情况下，可能根本不会传输日志条目。当访问日志中省略了日志条目时，访问日志中的条目数将与 AWS 账单和使用率报告中出现的使用率不匹配。

CloudFront 支持两个版本的标准日志记录。标准日志记录（旧版）*仅*支持将您的访问日志发送到 Amazon S3。标准日志记录（v2）支持其他传输目标。您可以为分配配置两个日志记录选项或其中之一。有关更多信息，请参阅以下主题：

**Topics**
+ [

# 配置标准日志记录（v2）
](standard-logging.md)
+ [

# 配置标准日志记录（旧版）
](standard-logging-legacy-s3.md)
+ [

# 标准日志记录引用
](standard-logs-reference.md)

**提示**  
CloudFront 还提供了实时访问日志，可以实时向您提供有关向分配发出的请求的信息（日志在收到请求后的几秒钟内传输）。您可以使用实时访问日志来进行监控和分析，并根据内容交付性能采取相应措施。有关更多信息，请参阅 [使用实时访问日志](real-time-logs.md)。

# 配置标准日志记录（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/)。

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

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

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

1. 选择用于接收您的日志的 Amazon S3 存储桶，并添加所需的权限。

1. 使用 CloudFront 控制台或 CloudFront API 配置标准日志记录（旧版）。您只能选择 Amazon S3 存储桶来接收日志。

1. 查看您的访问日志。

## 为标准日志选择 Amazon S3 存储桶
<a name="access-logs-choosing-s3-bucket"></a>

当您对分配启用日志记录时，需要指定您希望 CloudFront 将日志文件存储到其中的 Amazon S3 存储桶。如果您使用 Amazon S3 作为源，建议您对日志文件使用*单独的*存储桶。

指定您希望 CloudFront 用于存储访问日志的 Amazon S3 存储桶，例如 `amzn-s3-demo-bucket.s3.amazonaws.com`。

可将多个分配的日志文件存储在同一存储桶中。当您启用日志记录时，可为文件名指定一个可选前缀，以便您可以跟踪哪些日志文件与哪些分配相关联。

**关于选择 S3 存储桶**  
您的存储桶必须启用访问控制列表 (ACL)。如果从 CloudFront 控制台选择了未启用 ACL 的存储桶，则会出现一条错误消息。请参阅[权限](#AccessLogsBucketAndFileOwnership)。
不要选择 [S3 对象所有权](https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html)设置为**强制桶拥有者**的 Amazon S3 存储桶。该设置对存储桶以及其中的对象禁用 ACL，这会阻止 CloudFront 将日志文件传输到存储桶。[标准日志记录 V2](standard-logging.md)[AWS 区域](https://docs.aws.amazon.com/global-infrastructure/latest/regions/aws-regions.html)

## 权限
<a name="AccessLogsBucketAndFileOwnership"></a>

**重要**  
从 2023 年 4 月开始，您必须为用于 CloudFront 标准日志的新 S3 存储桶启用 S3 ACL。您可以在[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-new-bucket.html)时启用 ACL，也可以为[现有存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-ownership-existing-bucket.html)启用 ACL。  
有关这些更改的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[新 S3 桶的原定设置常见问题解答](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-faq.html)和《AWS 新闻博客》**中的[提醒：Amazon S3 安全更改将于 2023 年 4 月发布](https://aws.amazon.com/blogs/aws/heads-up-amazon-s3-security-changes-are-coming-in-april-of-2023/)。

您的 AWS 账户必须对您为日志文件指定的存储桶拥有以下权限：
+ 存储桶的 ACL 必须向您授予 `FULL_CONTROL` 如果您是存储桶拥有者，则默认情况下，您的账户具有此权限。如果您不是，则存储桶拥有者必须更新存储桶的 ACL。
+ `s3:GetBucketAcl`
+ `s3:PutBucketAcl`

**存储桶的 ACL**  
当您创建或更新分配并启用日志记录时，CloudFront 会使用这些权限更新存储桶的 ACL，以授予 `awslogsdelivery` 账户 `FULL_CONTROL` 权限。`awslogsdelivery` 账户将日志文件写入存储桶。如果您的账户没有更新 ACL 所需的权限，则创建或更新分配将会失败。  
在某些情况下，如果以编程方式提交请求以创建存储桶，但具有指定名称的存储桶已存在，则 S3 将存储桶上的权限重置为默认值。如果您已将 CloudFront 配置为将访问日志保存在 S3 存储桶中，并停止获取该存储桶中的日志，请检查存储桶上的权限，以确保 CloudFront 具有必要的权限。

**恢复存储桶的 ACL**  
如果您删除对 `awslogsdelivery` 账户的权限，则 CloudFront 无法将日志保存到 S3 存储桶。要使 CloudFront 能够再次开始保存您的分配的日志，请通过执行以下操作之一恢复 ACL 权限：  
+ 在 CloudFront 中对您的分配禁用日志记录，然后再次启用它。有关更多信息，请参阅 [标准日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesLoggingOnOff)。
+ 通过在 Amazon S3 控制台中导航到 S3 存储桶并添加权限，手动为 `awslogsdelivery` 添加 ACL 权限。要为 `awslogsdelivery` 添加 ACL，您必须提供账户的规范 ID，如下所示：

  `c4c1ede66af53448b93c283ce9448c4ba468c9432aa01d700d3878632f77d2d0`

  

  有关将 ACL 添加到 S3 存储桶的更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[配置 ACL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/managing-acls.html)。

**每个日志文件的 ACL**  
除了存储桶上的 ACL 之外，每个日志文件上还有一个 ACL。存储桶拥有者对每个日志文件均具有 `FULL_CONTROL` 权限，分配所有者（如果与存储桶拥有者不同）没有权限，而 `awslogsdelivery` 账户具有读取和写入权限。

**禁用日志记录**  
如果您禁用日志记录，则 CloudFront 并不会删除存储桶或日志文件的 ACL。如果需要，您可以删除 ACL。

### SSE-KMS 存储桶的必需密钥策略
<a name="AccessLogsKMSPermissions"></a>

如果标准日志的 S3 存储桶通过客户自主管理型密钥使用具有 AWS KMS keys的服务器端加密（SSE-KMS），您必须向客户自主管理型密钥的密钥策略添加以下语句。这样一来，CloudFront 可以将日志文件写入存储桶中。您无法将 SSE-KMS 与 AWS 托管式密钥结合使用，因为 CloudFront 无法将日志文件写入存储桶。

```
{
    "Sid": "Allow CloudFront to use the key to deliver logs",
    "Effect": "Allow",
    "Principal": {
        "Service": "delivery.logs.amazonaws.com"
    },
    "Action": "kms:GenerateDataKey*",
    "Resource": "*"
}
```

如果标准日志的 S3 存储桶将 SSE-KMS 与 [S3 存储桶密钥](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html)结合使用，您还需要将 `kms:Decrypt` 权限添加到策略语句中。在这种情况下，完整的策略语句如下所示。

```
{
    "Sid": "Allow CloudFront to use the key to deliver logs",
    "Effect": "Allow",
    "Principal": {
        "Service": "delivery.logs.amazonaws.com"
    },
    "Action": [
        "kms:GenerateDataKey*",
        "kms:Decrypt"
    ],
    "Resource": "*"
}
```

**注意**  
当您为 S3 存储桶启用 SSE-KMS 时，请指定客户自主管理型密钥的完整 ARN。有关更多信息，请参阅《Amazon Simple Storage Service 用户指南》**中的[借助 AWS KMS keys（SSE-KMS）指定服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-kms-encryption.html)。

## 启用标准日志记录（旧版）
<a name="standard-logs-legacy-enable"></a>

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

**Contents**
+ [

### 启用标准日志记录（旧版）（CloudFront 控制台）
](#standard-logs-legacy-enable-console)
+ [

### 启用标准日志记录（旧版）（CloudFront API）
](#standard-logs-legacy-enable-api)

### 启用标准日志记录（旧版）（CloudFront 控制台）
<a name="standard-logs-legacy-enable-console"></a>

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

1. 使用 CloudFront 控制台创建[新分配](distribution-web-creating-console.md)或[更新现有分配](HowToUpdateDistribution.md#HowToUpdateDistributionProcedure)。

1. 对于**标准日志记录**部分的**日志传输**，选择**开启**。

1. （可选）对于 **Cookie 日志记录**，如果您希望在日志中包含 Cookie，请选择**开启**。有关更多信息，请参阅 [Cookie 日志记录](DownloadDistValuesGeneral.md#DownloadDistValuesCookieLogging)。
**提示**  
Cookie 日志记录是一项全局设置，应用到您的分配的*所有*标准日志。您不能为单独的传输目标覆盖此设置。

1. 对于**交付至**部分，指定 **Amazon S3（旧版）**。

1. 指定您的 Amazon S3 存储桶。如果您还没有存储桶，可以选择**创建**，或者查看文档来[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。

1. （可选）对于**日志前缀**，指定您希望 CloudFront 作为此分配的访问日志文件名前缀的字符串（如有），例如 `exampleprefix/`。尾随斜杠 (/) 是可选的，但建议简化浏览您的日志文件。有关更多信息，请参阅 [日志前缀](DownloadDistValuesGeneral.md#DownloadDistValuesLogPrefix)。

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

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

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

### 启用标准日志记录（旧版）（CloudFront API）
<a name="standard-logs-legacy-enable-api"></a>

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

**为分配启用标准日志（CloudFront API）**
+ 使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html) 或 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html) API 操作，配置 [LoggingConfig](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_LoggingConfig.html) 对象。

## 编辑标准日志记录设置
<a name="ChangeSettings"></a>

您可通过使用 [CloudFront 控制台](https://console.aws.amazon.com/cloudfront/v4/home)或 CloudFront API 来启用或禁用日志记录、更改存储日志的 Amazon S3 存储桶以及更改日志文件的前缀。您对日志记录设置的更改将在 12 小时内生效。

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

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

当您向 Amazon S3 发送日志时，日志将显示为以下格式。

### 文件名格式
<a name="AccessLogsFileNaming"></a>

CloudFront 保存在您的 Amazon S3 存储桶中的每个日志文件的名称使用以下文件名格式：

`<optional prefix>/<distribution ID>.YYYY-MM-DD-HH.unique-ID.gz`

日期和时间用协调世界时 (UTC) 表示。

例如，如果您使用 `example-prefix` 作为前缀，并且您的分配 ID 为 `EMLARXS9EXAMPLE`，则您的文件名看起来类似于以下内容：

`example-prefix/EMLARXS9EXAMPLE.2019-11-14-20.RT4KCN4SGK9.gz`

当您对分配启用日志记录时，可为文件名指定一个可选前缀，以便您可以跟踪哪些日志文件与哪些分配相关联。如果您包含日志文件前缀的值，并且您的前缀不以正斜杠 (`/`) 结尾，CloudFront 则会自动追加一个。如果您的前缀以正斜杠结尾，则 CloudFront 不会添加另一个斜杠。

文件名末尾的 `.gz` 表示 CloudFront 已使用 gzip 压缩日志文件。

## 标准日志文件格式
<a name="LogFileFormat"></a>

日志文件中的每个条目分别提供有关单个查看器请求的详细信息。日志文件具有以下特征：
+ 使用 [W3C 扩展日志文件格式](https://www.w3.org/TR/WD-logfile.html)。
+ 包含制表符分隔的值。
+ 包含不一定按时间顺序排列的记录。
+ 包含两个标题行：一个具有文件格式版本，另一个列出了包含在每个记录中的 W3C 字段。
+ 包含字段值中的空格和某些其他字符的 URL 编码等效值。

  URL 编码的等效值用于以下字符：
  + ASCII 字符代码 0 到 32（含这两个值）
  + ASCII 字符代码 127 及更大值
  + 下表中的所有字符

  URL 编码标准在 [RFC 1738](https://tools.ietf.org/html/rfc1738.html) 中定义。


|  URL 编码值  |  字符  | 
| --- | --- | 
|  %3C  |  <  | 
|  %3E  |  >  | 
|  %22  |  "  | 
|  %23  |  \$1  | 
|  %25  |  %  | 
|  %7B  |  \$1  | 
|  %7D  |  \$1  | 
|  %7C  |  \$1  | 
|  %5C  |  \$1  | 
|  %5E  |  ^  | 
|  %7E  |  \$1  | 
|  %5B  |  [  | 
|  %5D  |  ]  | 
|  %60  |  `  | 
|  %27  |  '  | 
|  %20  |  空格  | 

## 删除日志文件
<a name="DeletingLogFiles"></a>

CloudFront 不会自动从您的 Amazon S3 存储桶中删除日志文件。有关从 Amazon S3 存储桶中删除日志文件的信息，请参阅《*Amazon Simple Storage Service 控制台用户指南*》中的[删除对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjects.html)。

## 定价
<a name="AccessLogsCharges"></a>

标准日志记录是 CloudFront 的一个可选功能。对于启用标准日志，CloudFront 不收取任何费用。但是，在 Amazon S3 上存储和访问文件会产生常规的 Amazon S3 费用。不过您可以随时删除这些文件。

有关 Amazon S3 定价的更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

有关 CloudFront 定价的更多信息，请参阅 [CloudFront 定价](https://aws.amazon.com/cloudfront/pricing/)。

# 标准日志记录引用
<a name="standard-logs-reference"></a>

以下各节适用于标准日志记录（v2）和标准日志记录（旧版）。

**Topics**
+ [

## 日志文件传输时间
](#access-logs-timing)
+ [

## 当请求 URL 或标头超出最大大小时如何记录请求
](#access-logs-request-URL-size)
+ [

## 日志文件字段
](#BasicDistributionFileFormat)
+ [

## 分析日志
](#access-logs-analyzing)

## 日志文件传输时间
<a name="access-logs-timing"></a>

CloudFront 每个小时会为分配传输若干次日志。一般而言，日志文件包含有关 CloudFront 在给定时间段内收到的请求的信息。CloudFront 通常会在日志中所显示事件发生后的一个小时内，将该时间段内的日志文件传输至目标。但是，请注意，某个时间段内的某些或所有日志文件条目有时可延迟长达 24 小时。当日志条目延迟时，CloudFront 会将它们保存在日志文件中，其文件名称包括*发生*请求的时间段的日期和时间（而不是文件传输的日期和时间）。

创建日志文件时，CloudFront 将在日志文件涵盖的时间段内从收到对象请求的所有边缘站点整合分配信息。

CloudFront 可为某个时间段保存多个文件，具体取决于 CloudFront 收到的针对与分配相关联的对象的请求数。

CloudFront 在您启用日志记录后大约四个小时开始可靠地传输访问日志。您可能会获得一些在此时间之前的访问日志。

**注意**  
如果在此期间没有用户请求您的对象，您就不会收到该期间的任何日志文件。

## 当请求 URL 或标头超出最大大小时如何记录请求
<a name="access-logs-request-URL-size"></a>

如果所有请求标头（包括 Cookie）的总大小超过 20KB，或者如果 URL 超过 8192 字节，则 CloudFront 无法完整解析并记录请求。由于未记录该请求，因此您在日志文件中看不到返回的 HTTP 错误状态代码。

如果请求正文超出最大大小，则会记录请求，包括 HTTP 错误状态代码。

## 日志文件字段
<a name="BasicDistributionFileFormat"></a>

分配的日志文件包含 33 个字段。以下列表包含每个字段名称（按顺序）以及该字段中信息的描述。

1. **`date`**

   事件发生日期的格式为 `YYYY-MM-DD`。例如：`2019-06-30`。日期和时间用协调世界时 (UTC) 表示。对于 WebSocket 连接，这是关闭连接的日期。

1. **`time`**

   CloudFront 服务器完成响应请求的时间（采用 UTC 时间），例如 `01:42:39`。对于 WebSocket 连接，这是关闭连接的时间。

1. **`x-edge-location`**

   服务请求的边缘站点。每个边缘站点由三个字母的代码和任意分配的数字来确定（例如，DFW3）。三个字母代码通常对应邻近边缘站点的地理位置的机场的国际航空协会（IATA）机场代码。（这些缩写将来可能会更改。）

1. **`sc-bytes`**

   服务器在响应请求时向查看器提供的字节的总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从服务器发送到客户端的字节的总数。

1. **`c-ip`**

   已发出请求的查看器的 IP 地址，例如 `192.0.2.183` 或 `2001:0db8:85a3::8a2e:0370:7334`。如果查看器已使用 HTTP 代理或负载均衡器发送请求，则此字段的值为该代理或负载均衡器的 IP 地址。另请参阅 `x-forwarded-for` 字段。

1. **`cs-method`**

   从查看器接收的 HTTP 请求方法。

1. **`cs(Host)`**

   CloudFront 分配的域名（例如，d111111abcdef8.cloudfront.net）。

1. **`cs-uri-stem`**

   请求 URL 中标识路径和对象的部分（例如 `/images/cat.jpg`）。URL 和查询字符串中的问号 (?) 不包含在日志中。

1. **`sc-status`**

   包含下列值之一：
   + 服务器响应的 HTTP 状态代码（例如 `200`）。
   + `000`，表示查看器已在服务器可以响应请求之前关闭连接。如果查看器在服务器开始发送响应后关闭连接，则此字段包含服务器开始发送的响应的 HTTP 状态代码。

1. **`cs(Referer)`**

   请求中的 `Referer` 标头的值。这是发出请求的域的名称。常见引用站点包括搜索引擎、直接链接到您的对象的其他网站及您自己的网站。

1. **`cs(User-Agent)`**

   请求中的 `User-Agent` 标头的值。`User-Agent` 标头标识请求的来源，例如提交请求的设备和浏览器的类型，如果请求来自搜索引擎，则标识具体的搜索引擎。

1. **`cs-uri-query`**

   请求 URL 的查询字符串部分（如果有）。

   如果 URL 不包含查询字符串，则此字段的值为连字符 (-)。有关更多信息，请参阅 [根据查询字符串参数缓存内容](QueryStringParameters.md)。

1. **`cs(Cookie)`**

   请求中的 `Cookie` 标头，包括名称/值对和关联的属性。

   如果您启用了 Cookie 日志记录，无论您选择将哪种 Cookie 转发到源，CloudFront 都将记录所有请求中的 Cookie。当请求不包含 Cookie 标头时，此字段的值为连字符 (-)。有关 cookies 的更多信息，请参阅 [根据 Cookie 缓存内容](Cookies.md)。

1. **`x-edge-result-type`**

   在最后一个字节离开服务器后服务器如何对响应进行分类。在某些情况下，结果类型可能会在服务器准备发送响应的时间与完成发送响应的时间之间发生变化。另请参阅 `x-edge-response-result-type` 字段。

   例如，在 HTTP 流中，假设服务器在缓存中发现流的一个区段。在这种情况下，此字段的值通常为 `Hit`。但是，如果查看器在服务器传送整个区段之前关闭连接，则最终结果类型（以及此字段的值）为 `Error`。

   WebSocket 和 gRPC 连接的此字段的值为 `Miss`，因为内容不可缓存，并直接代理到源。

   可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 HTTP 503 状态代码，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。如果 `sc-status` 字段的值为 `200`，或者如果此字段的值为 `Error` 且 `x-edge-response-result-type` 字段的值不是 `Error`，则表示 HTTP 请求已成功，但客户端在接收所有字节之前断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`x-edge-request-id`**

   唯一地标识请求的不透明字符串。CloudFront 还会在 `x-amz-cf-id` 响应标头中发送此字符串。

1. **`x-host-header`**

   查看器在该请求的 `Host` 标头中包含的值。如果您在对象 URL 中使用 CloudFront 域名（如 d111111abcdef8.cloudfront.net），则此字段将包含该域名。如果在您的对象 URL（例如 www.example.com）中使用的是备用域名（CNAME），则此字段将包含备用域名。

   如果您使用的是备用域名，请参阅与您的分配关联的域名的字段 7 中的 `cs(Host)`。

1. **`cs-protocol`**

   查看器请求的协议（`http`、`https`、`grpcs`、`ws` 或 `wss`）。

1. **`cs-bytes`**

   查看器包含在请求中的数据字节总数，包括标头。对于 WebSocket 和 gRPC 连接，这是通过连接从客户端发送到服务器的字节的总数。

1. **`time-taken`**

   服务器收到查看器的请求的时间与服务器将响应的最后一个字节写入输出队列的时间之间相隔的秒数（精确至千分之一秒，例如 0.082），以服务器上测量的时间为准。从查看器的角度看，由于网络延迟和 TCP 缓冲的原因，获得完整响应的总时间将会超过该值。

1. **`x-forwarded-for`**

   如果查看器已使用 HTTP 代理或负载均衡器发送请求，则 `c-ip` 字段的值为该代理或负载均衡器的 IP 地址。在本例中，此字段为发出请求的查看器的 IP 地址。此字段可以包含多个逗号分隔的 IP 地址。每个 IP 地址可以是 IPv4 地址（如 `192.0.2.183`）或 IPv6 地址（如 `2001:0db8:85a3::8a2e:0370:7334`）。

   如果查看器未使用 HTTP 代理或负载均衡器，则此字段的值为连字符 (-)。

1. **`ssl-protocol`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于传输请求和响应的 SSL/TLS 协议。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 协议。

   如果字段 17 中的 `cs-protocol` 为 `http`，则此字段的值为连字符 (-)。

1. **`ssl-cipher`**

   如果请求使用了 HTTPS，则此字段包含查看器和服务器协商用于加密请求和响应的 SSL/TLS 密码。有关可能的值的列表，请参阅[查看器和 CloudFront 之间支持的协议和密码](secure-connections-supported-viewer-protocols-ciphers.md)中支持的 SSL/TLS 密码。

   如果字段 17 中的 `cs-protocol` 为 `http`，则此字段的值为连字符 (-)。

1. **`x-edge-response-result-type`**

   服务器在将响应返回到查看器之前如何对响应进行分类。另请参阅 `x-edge-result-type` 字段。可能的值包括：
   + `Hit` – 服务器从缓存中将对象提供给查看器。
   + `RefreshHit` – 服务器在缓存中找到了对象，但该对象已过期，因此，服务器联系了源，以验证缓存是否具有该对象的最新版本。
   + `Miss` – 缓存中的对象无法满足请求，因此，服务器将请求转发到源服务器并将结果返回到查看器。
   + `LimitExceeded` – 请求被拒绝，因为超出了 CloudFront 配额（以前称为限制）。
   + `CapacityExceeded` – 服务器返回了 503 错误，因为它在请求时没有足够的容量来服务对象。
   + `Error` – 通常，这意味着请求会导致客户端错误（`sc-status` 字段的值在 `4xx` 范围内）或服务器错误（`sc-status` 字段的值在 `5xx` 范围内）。

     如果 `x-edge-result-type` 字段的值为 `Error`，而此字段的值不是 `Error`，则客户端在下载完成前已断开连接。
   + `Redirect` – 服务器已根据分发设置将查看器从 HTTP 重定向到 HTTPS。
   + `LambdaExecutionError`：由于关联格式错误、函数超时、AWS 依赖关系问题或其它正式发布问题，与分配关联的 Lambda@Edge 函数未完成。

1. **`cs-protocol-version`**

   查看器在请求中指定的 HTTP 版本。可能的值包括 `HTTP/0.9`、`HTTP/1.0`、`HTTP/1.1`、`HTTP/2.0` 和 `HTTP/3.0`。

1. **`fle-status`**

   在为分配配置[字段级加密](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/field-level-encryption.html)时，此字段包含一个指示是否已成功处理请求正文的代码。如果服务器成功处理了请求正文，加密了指定字段中的值并将请求转发到源，则此字段的值为 `Processed`。在这种情况下，`x-edge-result-type` 的值仍可以指示客户端或服务器端错误。

   此字段的可能值包括：
   + `ForwardedByContentType` – 由于没有配置内容类型，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedByQueryArgs` – 由于请求包含的查询参数不在字段级加密的配置中，因此服务器将请求转发到了源，而不进行解析或加密。
   + `ForwardedDueToNoProfile` – 由于在字段级加密的配置中没有指定配置文件，因此服务器将请求转发到了源，而不进行解析或加密。
   + `MalformedContentTypeClientError` – 由于 `Content-Type` 标头值的格式无效，因此，服务器拒绝了该请求并向查看器返回了 HTTP 400 状态代码。
   + `MalformedInputClientError` – 由于请求正文的格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `MalformedQueryArgsClientError` – 由于查询参数为空或格式无效，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByContentType` – 由于在字段级加密的配置中没有指定内容类型，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `RejectedByQueryArgs` – 由于在字段级加密的配置中没有指定查询参数，因此服务器拒绝了该请求，并向查看器返回了 HTTP 400 状态代码。
   + `ServerError` – 源服务器返回了错误。

   如果请求超出字段级加密配额（以前称作限制），则此字段包含下列错误代码之一，并且服务器向查看器返回 HTTP 状态代码 400。有关字段级加密的当前配额的列表，请参[对字段级加密的配额](cloudfront-limits.md#limits-field-level-encryption)。
   + `FieldLengthLimitClientError` – 配置为加密的字段超出允许的最大长度。
   + `FieldNumberLimitClientError` – 将分配配置为加密的请求包含的字段数超过允许值。
   + `RequestLengthLimitClientError` – 在配置了字段级加密时，请求正文的长度超出允许的最大长度。

   如果没有为分配配置字段级加密，则此字段的值为连字符 (-)。

1. **`fle-encrypted-fields`**

   服务器加密并转发到源的[字段级加密](field-level-encryption.md)字段的数量。CloudFront 服务器在加密数据时会将处理的请求传输到源，这样一来，即使 `fle-status` 的值为错误，此字段也会具有值。

   如果没有为分配配置字段级加密，则此字段的值为连字符 (-)。

1. **`c-port`**

   查看器发出的请求的端口号。

1. **`time-to-first-byte`**

   从收到请求到写入响应的第一个字节之间的秒数（在服务器上测量）。

1. **`x-edge-detailed-result-type`**

   此字段包含与 `x-edge-result-type` 字段相同的值，但以下情况除外：
   + 当对象从[源护盾](origin-shield.md)层提供给查看器时，该字段包含 `OriginShieldHit`。
   + 当对象不在 CloudFront 缓存中并且响应是由[源请求 Lambda@Edge 函数](lambda-at-the-edge.md)生成时，此字段包含 `MissGeneratedResponse`。
   + 当 `x-edge-result-type` 字段的值为 `Error` 时，此字段包含以下值之一，其中包含有关错误的更多信息：
     + `AbortedOrigin` – 服务器遇到了源方面的问题。
     + `ClientCommError` – 由于服务器与查看器之间的通信问题，对查看器的响应已中断。
     + `ClientGeoBlocked` - 将分配配置为拒绝来自查看器地理位置的请求。
     + `ClientHungUpRequest` - 查看器在发送请求时提前停止。
     + `Error` – 出现错误，其错误类型不适合任何其他类别。当服务器从缓存提供错误响应时，可能会发生此类型的错误。
     + `InvalidRequest` – 服务器收到了来自查看器的无效请求。
     + `InvalidRequestBlocked` - 阻止对所请求资源的访问。
     + `InvalidRequestCertificate` - 分配与建立 HTTPS 连接的 SSL/TLS 证书不匹配。
     + `InvalidRequestHeader` - 请求包含无效的标头。
     + `InvalidRequestMethod` - 未将分配配置为处理所使用的 HTTP 请求方法。当分配仅支持可缓存请求时，可能会发生这种情况。
     + `OriginCommError` – 连接到源或从源读取数据时，请求超时。
     + `OriginConnectError` – 服务器无法连接到源。
     + `OriginContentRangeLengthError` - 源响应中的 `Content-Length` 标头与 `Content-Range` 标头中的长度不匹配。
     + `OriginDnsError` – 服务器无法解析源的域名。
     + `OriginError` - 源返回不正确的响应。
     + `OriginHeaderTooBigError` - 源返回的标头太大，边缘服务器无法处理。
     + `OriginInvalidResponseError` - 源返回无效响应。
     + `OriginReadError` – 服务器无法从源读取。
     + `OriginWriteError` – 服务器无法写入到源。
     + `OriginZeroSizeObjectError` - 从源发送的零大小对象会导致错误。
     + `SlowReaderOriginError` - 查看器读取导致源错误的消息时速度较慢。

1. **`sc-content-type`**

   响应的 HTTP `Content-Type` 标头的值。

1. **`sc-content-len`**

   响应的 HTTP `Content-Length` 标头的值。

1. **`sc-range-start`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围起始值。

1. **`sc-range-end`**

   当响应包含 HTTP `Content-Range` 标头时，此字段包含范围结束值。

1. **`distribution-tenant-id`**

   分配租户的 ID。

1. **`connection-id`**

   TLS 连接的唯一标识符。

   您必须先为分配启用 mTLS，之后才能获取此字段的信息。有关更多信息，请参阅 [CloudFront 的双向 TLS 身份验证（查看器 mTLS）源双向 TLS 与 CloudFront 结合使用](mtls-authentication.md)。

   

以下是分配的日志文件示例：

```
#Version: 1.0
#Fields: 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
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==	d111111abcdef8.cloudfront.net	https	23	0.001	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.001	Hit	text/html	78	-	-
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	k6WGMNkEzR5BEM_SaF47gjtX9zBDO2m349OY2an0QPEaUum1ZOLrow==	d111111abcdef8.cloudfront.net	https	23	0.000	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.000	Hit	text/html	78	-	-
2019-12-04	21:02:31	LAX1	392	192.0.2.100	GET	d111111abcdef8.cloudfront.net	/index.html	200	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Hit	f37nTMVvnKvV2ZSvEsivup_c2kZ7VXzYdjC-GUQZ5qNs-89BlWazbw==	d111111abcdef8.cloudfront.net	https	23	0.001	-	TLSv1.2	ECDHE-RSA-AES128-GCM-SHA256	Hit	HTTP/2.0	-	-	11040	0.001	Hit	text/html	78	-	-	
2019-12-13	22:36:27	SEA19-C1	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/favicon.ico	502	http://www.example.com/	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Error	1pkpNfBQ39sYMnjjUQjmH2w1wdJnbHYTbag21o_3OfcQgPzdL2RSSQ==	www.example.com	http	675	0.102	-	-	-	Error	HTTP/1.1	-	-	25260	0.102	OriginDnsError	text/html	507	-	-
2019-12-13	22:36:26	SEA19-C1	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/	502	-	Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36	-	-	Error	3AqrZGCnF_g0-5KOvfA7c9XLcf4YGvMFSeFdIetR1N_2y8jSis8Zxg==	www.example.com	http	735	0.107	-	-	-	Error	HTTP/1.1	-	-	3802	0.107	OriginDnsError	text/html	507	-	-
2019-12-13	22:37:02	SEA19-C2	900	192.0.2.200	GET	d111111abcdef8.cloudfront.net	/	502	-	curl/7.55.1	-	-	Error	kBkDzGnceVtWHqSCqBUqtA_cEs2T3tFUBbnBNkB9El_uVRhHgcZfcw==	www.example.com	http	387	0.103	-	-	-	Error	HTTP/1.1	-	-	12644	0.103	OriginDnsError	text/html	507	-	-
```

## 分析日志
<a name="access-logs-analyzing"></a>

由于您每小时可以收到多个访问日志，因此建议您将给定时段内接收的所有日志文件合并成一个文件。然后，您可更准确更全面地分析该时期内的数据。

分析访问日志的一种方式是使用 [Amazon Athena](https://aws.amazon.com/athena/)。Athena 是一项交互式查询服务，可以帮助您为 AWS 服务（包括 CloudFront）分析数据。要了解更多信息，请参阅《Amazon Athena 用户指南》**中的[查询 Amazon CloudFront 日志](https://docs.aws.amazon.com/athena/latest/ug/cloudfront-logs.html) 。

此外，以下 AWS 博客文章讨论了分析访问日志的一些方式。
+ [Amazon CloudFront 请求日志记录](https://aws.amazon.com/blogs/aws/amazon-cloudfront-request-logging/)（针对通过 HTTP 提供的内容）
+ [增强的 CloudFront 日志，现在包含查询字符串](https://aws.amazon.com/blogs/aws/enhanced-cloudfront-logs-now-with-query-strings/)