

# 使用服务器访问日志记录来记录请求
<a name="ServerLogs"></a>

服务器访问日志记录详细地记录对存储桶提出的各种请求。对于许多应用程序而言，服务器访问日志很有用。例如，访问日志信息可能在安全和访问权限审核方面很有用。此信息还有助于您了解客户群以及您的 Amazon S3 账单。

**注意**  
服务器访问日志不会记录 2019 年 3 月 20 日之后发布的区域的不正确区域重定向错误的相关信息。在存储桶所在区域的外部发出对象或存储桶的请求时，会发生不正确区域重定向错误。

## 如何启用日志传送？
<a name="server-access-logging-overview"></a>

要启用日志传输，请执行以下基本步骤。有关更多信息，请参阅 [启用 Amazon S3 服务器访问日志记录](enable-server-access-logging.md)。

1. **提供目的地存储桶**（也称为*目标存储桶*）的名称。此存储桶是您希望 Amazon S3 用于将访问日志保存为对象的位置。源存储桶和目标存储桶必须位于同一个 Amazon Web Services 区域，并且由同一个账户拥有。目标存储桶不得具有 S3 对象锁定默认保留期配置。目标存储桶也不得启用申请方付款。

   您可以让日志传输至您拥有的且与源存储桶位于同一区域中的任何存储桶，包括源存储桶本身。不过，为了更方便地管理日志，我们建议您将访问日志保存在不同的存储桶中。

   当源存储桶和目标存储桶是同一存储桶时，将为写入该存储桶的日志创建额外的日志，从而形成日志的无限循环。我们不建议这样做，因为它会导致您的存储账单金额小幅增加。此外，有关日志的额外日志可能会导致更难以找到您所查找的日志。

   如果您选择将访问日志保存在源存储桶中，建议您为所有日志对象键指定目的地前缀（也称为*目标前缀*）。指定前缀时，所有日志对象名称都以公共字符串开头，从而使日志对象更易识别。

1. **（可选）将一个目标前缀分配给所有 Amazon S3 日志对象键。**利用目的地前缀（也称作*目标前缀*），可更轻松地找到日志对象。例如，如果您指定前缀值 `logs/`，则 Amazon S3 创建的每个日志对象的键均以 `logs/` 前缀开头，例如：

   ```
   logs/2013-11-01-21-32-16-E568B2907131C0C0
   ```

   如果指定前缀值 `logs`，则日志对象如下所示：

   ```
   logs2013-11-01-21-32-16-E568B2907131C0C0
   ```

   当同一目标存储桶有多个存储桶日志时，[键前缀](https://docs.amazonaws.cn/general/latest/gr/glos-chap.html#keyprefix)也可用于区分源存储桶。

   当您删除日志时，此前缀也很有用。例如，您可以设置一个生命周期配置规则，让 Amazon S3 删除具有特定前缀的对象。有关更多信息，请参阅 [删除 Amazon S3 日志文件](deleting-log-files-lifecycle.md)。

1. **（可选）设置权限**以使其他人能够访问生成的日志。**默认情况下，仅存储桶拥有者始终拥有日志对象的完全访问权限。如果您的目标存储桶使用 S3 对象所有权的强制存储桶拥有者设置来禁用访问控制列表（ACL），则无法在使用 ACL 的目的地授权（也称作*目标授权*）中授予权限。但是，您可以更新目标存储桶的存储桶策略以向其他存储桶授予访问权限。有关更多信息，请参阅[Amazon S3 的身份和访问管理](security-iam.md)和[日志传输的权限](enable-server-access-logging.md#grant-log-delivery-permissions-general)。

1. **（可选）为日志文件设置日志对象键格式。**对于日志对象键格式（也称为*目标对象键格式*），有两个选项：
   + **非基于日期的分区** - 这是原始日志对象键格式。如果选择此格式，则日志文件键格式如下所示：

     ```
     [DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
     ```

     例如，如果您指定 `logs/` 作为前缀，则日志对象将按以下方式命名：

     ```
     logs/2013-11-01-21-32-16-E568B2907131C0C0
     ```
   + **基于日期的分区** - 如果选择基于日期的分区，则可以选择日志文件的事件时间或传输时间作为日志格式中使用的日期源。此格式让查询日志变得更轻松。

     如果选择基于日期的分区，则日志文件键格式如下所示：

     ```
     [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
     ```

     例如，如果您指定 `logs/` 作为目标前缀，则日志对象将按以下方式命名：

     ```
     logs/123456789012/us-west-2/amzn-s3-demo-source-bucket/2023/03/01/2023-03-01-21-32-16-E568B2907131C0C0
     ```

     对于传输时间传送，日志文件名中的时间与日志文件的传输时间对应。

     对于事件时间传送，年、月和日对应于事件的发生日期，小时、分钟和秒设置为键中的 `00`。这些日志文件中传送的日志仅针对特定日期。

   

   如果您通过 Amazon Command Line Interface（Amazon CLI）、Amazon SDK 或 Amazon S3 REST API 配置日志，请使用 `TargetObjectKeyFormat` 指定日志对象键格式。要指定非基于日期的分区，请使用 `SimplePrefix`。要指定基于日期的分区，请使用 `PartitionedPrefix`。如果使用 `PartitionedPrefix`，则使用 `PartitionDateSource` 来指定 `EventTime` 或 `DeliveryTime`。

   对于 `SimplePrefix`，日志文件键格式如下所示：

   ```
   [TargetPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
   ```

   对于带事件时间或传输时间的 `PartitionedPrefix`，日志文件键格式如下所示：

   ```
   [TargetPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
   ```

## 日志对象键格式
<a name="server-log-keyname-format"></a>

Amazon S3 将以下对象键格式用于在目标存储桶中上传的日志对象：
+ **非基于日期的分区** - 这是原始日志对象键格式。如果选择此格式，则日志文件键格式如下所示：

  ```
  [DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
  ```
+ **基于日期的分区** - 如果选择基于日期的分区，则可以选择日志文件的事件时间或传输时间作为日志格式中使用的日期源。此格式让查询日志变得更轻松。

  如果选择基于日期的分区，则日志文件键格式如下所示：

  ```
  [DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]
  ```

在日志对象键中，`YYYY`、`MM`、`DD`、`hh`、`mm` 和 `ss` 分别是表示年、月、日、小时、分钟和秒的数字。这些日期和时间采用协调世界时 (UTC)。

在特定时间传输的日志文件可包含在该时间前的任何时刻编写的记录。无法知道是否已传输特定时间间隔内的所有日志记录。

键的 `UniqueString` 部分用于防止覆盖文件。它没有意义，日志处理软件应忽略它。

## 如何传输日志？
<a name="how-logs-delivered"></a>

Amazon S3 定期收集访问日志记录，在日志文件中整合这些记录，然后将日志文件作为日志对象上传到目标存储桶。如果多个启用了日志记录的源存储桶使用相同的目标存储桶，此目标存储桶中将保留所有这些源存储桶的访问日志。但是，每个日志对象只会报告特定源存储桶的访问日志记录。

Amazon S3 使用特殊的日志传输账户写入服务器访问日志。这些写入受常规的访问控制限制。我们建议您更新目标存储桶上的存储桶策略，以授予对日志记录服务主体（`logging.s3.amazonaws.com`）的访问权限来进行访问日志传输。您也可以通过存储桶访问控制列表（ACL）向 S3 日志传输组授予访问日志传输的访问权限。但是，建议不要使用存储桶 ACL 授予对 S3 日志传输组的访问权限。

当您启用服务器访问日志记录并通过目标存储桶策略授予访问日志传输的访问权限时，您必须更新该策略，以允许日志记录服务主体访问 `s3:PutObject`。如果您使用 Amazon S3 控制台启用服务器访问日志录入，该控制台会自动更新目标存储桶策略，以便将这些权限授予日志记录服务主体。有关授予服务器访问日志传输的权限的更多信息，请参阅 [日志传输的权限](enable-server-access-logging.md#grant-log-delivery-permissions-general)。

**注意**  
对于 VPC 端点策略拒绝的 VPC 端点请求，或者对于在评估 VPC 策略之前失败的请求，S3 不支持向请求者或存储桶拥有者传输 CloudTrail 日志或服务器访问日志。

**S3 对象所有权的强制存储桶拥有者设置**  
如果目标存储桶使用对象所有权的强制存储桶拥有者设置，ACL 将被禁用，并且不再影响权限。您必须更新目标存储桶上的存储桶策略，以授予对日志记录服务主体的访问权。有关对象所有权的更多信息，请参阅[为服务器访问日志记录授予对 S3 日志传输组的访问权限](object-ownership-migrating-acls-prerequisites.md#object-ownership-server-access-logs)。

## 最大努力服务器日志传输
<a name="LogDeliveryBestEffort"></a>

服务器访问日志记录会以最大努力进行传输。针对已正确配置了日志记录的存储桶的大多数请求会导致传输一条日志记录。大多数日志记录将在记录后的几小时内传输，但可以更频繁地传输这些记录。

因此不能保证服务器日志记录的完整性和即时性。特殊请求的日志记录可能会在实际处理了请求之后进行传输，也可能*根本不会传输*。您甚至可能会看到日志记录的副本。服务器日志的用途在于向您提供有关存储桶流量性质方面的信息。虽然日志记录丢失或重复的情况十分少见，但请注意，服务器日志记录并不旨在完整记录所有请求。

由于服务器日志记录特征的最大努力性质，使用情况报告中可能有一个或多个访问请求不会出现在传输的服务器日志中。您可以在 Amazon 账单与成本管理 控制台的**成本和使用情况报告**下找到这些使用情况报告。

## 存储桶日志记录状态更改将逐渐生效
<a name="BucketLoggingStatusChanges"></a>

存储桶日志记录状态的更改需要一定时间才能实际影响日志文件的传输。例如，如果您为某个存储桶启用了日志记录，那么将记录在以下时间内发送的请求，而不会记录其他请求。假定您将日志记录的目标存储桶从存储桶 A 更改为存储桶 B，则在接下来的一个小时里仍可能有一些日志传输到存储桶 A，但其他日志则会传输到新的目标存储桶 B。无论如何，新的设置将最终生效，并且您无需执行任何操作。

有关日志记录和日志文件的更多信息，请参阅以下各部分：

**Topics**
+ [如何启用日志传送？](#server-access-logging-overview)
+ [日志对象键格式](#server-log-keyname-format)
+ [如何传输日志？](#how-logs-delivered)
+ [最大努力服务器日志传输](#LogDeliveryBestEffort)
+ [存储桶日志记录状态更改将逐渐生效](#BucketLoggingStatusChanges)
+ [启用 Amazon S3 服务器访问日志记录](enable-server-access-logging.md)
+ [Amazon S3 服务器访问日志格式](LogFormat.md)
+ [删除 Amazon S3 日志文件](deleting-log-files-lifecycle.md)
+ [使用 Amazon S3 服务器访问日志来确定请求](using-s3-access-logs-to-identify-requests.md)
+ [排查服务器访问日志记录问题](troubleshooting-server-access-logging.md)