

# 标准日志记录引用
<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/)