

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 您的网络负载均衡器的访问日志
访问日志

弹性负载均衡提供了访问日志，该访问日志可捕获有关使用网络负载均衡器建立的 TLS 连接的详细信息。您可以使用这些访问日志分析流量模式并解决问题。

**重要**  
 虽然传统的 “传统” 访问日志（如本节所述）仍然可用，但 Network Load Balancer 现在通过 CloudWatch 日志提供了增强的日志记录选项。 CloudWatch 日志提供了更灵活的传输选项，包括发送到亚马逊 CloudWatch 日志、亚马逊数据 Firehose 和亚马逊简单存储服务。要配置这些改进的日志记录选项，请访问负载均衡器的***集成***选项卡。有关 CloudWatch 日志的更多信息，请参阅[CloudWatch 你的 Network Load Balancer 的日志](load-balancer-cloudwatch-logs.md)。

**重要**  
仅当负载均衡器具有 TLS 侦听器且日志仅包含有关 TLS 请求的信息时，才创建访问日志。访问日志将尽力记录请求。我们建议您使用访问日志来了解请求性质，而不是作为所有请求的完整描述。

访问日志记录是 Elastic Load Balancing 的一项可选功能，默认情况下已禁用此功能。为负载均衡器启用访问日志记录之后，Elastic Load Balancing 将日志捕获为压缩文件并将其存储在您指定的 Amazon S3 存储桶中。您可以随时禁用访问日志记录。

您可以使用 Amazon S3 托管加密密钥（SSE-S3）启用服务器端加密，也可使用 Key Management Service 与 S3 存储桶的客户管理的密钥（SSE-KMS CMK）来启用服务器端加密。每个访问日志文件在存储到 S3 存储桶中之前将自动加密，并在您访问它时进行解密。您不需要执行任何操作，因为这与您访问加密的日志文件或未加密的日志文件的方式基本相同。每个日志文件都使用一个唯一密钥进行加密，此密钥本身将使用定期轮换的 KMS 密钥进行加密。*有关更多信息，请参阅 [Amazon S3 用户指南中的指定 Amazon S3 加密 (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-s3-encryption.html) [和使用 AWS KMS (SSE-KMS) 指定服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-kms-encryption.html)。*

使用访问日志无需额外付费。您需要支付 Amazon S3 的存储费用，但无需支付 Elastic Load Balancing 用以将日志文件发送到 Amazon S3 的带宽费用。有关存储成本的更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

**Topics**
+ [

## 访问日志文件
](#access-log-file-format)
+ [

## 访问日志条目
](#access-log-entry-format)
+ [

## 处理访问日志文件
](#log-processing-tools)
+ [启用访问日志](enable-access-logs.md)
+ [禁用访问日志](disable-access-logs.md)

## 访问日志文件


Elastic Load Balancing 每 5 分钟为每个负载均衡器节点发布一次日志文件。日志传输最终是一致的。负载均衡器可以传输相同时间段的多个日志。通常，如果站点具有高流量，会出现此情况。

访问日志的文件名采用以下格式：

```
bucket[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/yyyy/mm/dd/aws-account-id_elasticloadbalancing_region_net.load-balancer-id_end-time_random-string.log.gz
```

*bucket*  
S3 存储桶的名称。

*prefix*  
存储桶中的前缀 (逻辑层级结构)。如果您不指定前缀，则会将日志置于存储桶的根级。

*aws-account-id*  
所有者的 AWS 账户 身份证。

*region*  
负载均衡器和 S3 存储桶所在的区域。

*yyyy*/*mm*/*dd*  
传输日志的日期。

*load-balancer-id*  
负载均衡器的资源 ID。如果资源 ID 包含任何正斜杠 (/)，这些正斜杠将替换为句点 (.)。

*end-time*  
日志记录间隔结束的日期和时间。例如，结束时间 20181220T2340Z 包含在 23:35 和 23:40 之间发出的请求的条目。

*random-string*  
系统生成的随机字符串。

以下是示例日志文件名：

```
s3://my-bucket/prefix/AWSLogs/123456789012/elasticloadbalancing/us-east-2/2020/05/01/123456789012_elasticloadbalancing_us-east-2_net.my-loadbalancer.1234567890abcdef_20200501T0000Z_20sg8hgm.log.gz
```

日志文件可以在存储桶中存储任意长时间，不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。有关更多信息，请参阅*《Amazon S3 用户指南》*中的[管理存储生命周期](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html)。

## 访问日志条目


下表按顺序描述了访问日志条目的字段。使用空格分隔所有字段。在引入新的字段时，会将这些字段添加到日志条目的末尾。在处理日志文件时，您应忽略日志条目结尾的任何不需要的字段。


| 字段 | 描述 | 
| --- | --- | 
| 类型 |  侦听器的类型。支持的值为 `tls`。  | 
| 版本 |  日志条目的版本。当前版本为 2.0。  | 
| time |  在 TLS 连接结束时记录的时间（采用 ISO 8601 格式）。  | 
| elb |  负载均衡器的资源 ID。  | 
| 侦听器 |  连接的 TLS 侦听器的资源 ID。  | 
| client\$1port |  客户端的 IP 地址和端口。  | 
| destination\$1port |  目的地 IP 地址和端口。如果客户端直接连接到负载均衡器，则目的地是侦听器。如果客户端使用 VPC 终端节点服务进行连接，则目的地是 VPC 终端节点。  | 
| connection\$1time |  连接完成（从开始到结束）的总时间（以毫秒为单位）。  | 
| tls\$1handshake\$1time |  建立 TCP 连接后完成 TLS 握手的总时间，包括客户端延迟（以毫秒为单位）。此时间包括在 `connection_time` 字段中。如果未发生 TLS 握手或 TLS 握手失败，则该值设置为 `-`。  | 
| received\$1bytes |  解密后，负载均衡器从客户端处收到的字节数。  | 
| sent\$1bytes |  在加密之前，负载均衡器发送到客户端的字节数。  | 
| incoming\$1tls\$1alert |  负载均衡器从客户端处收到的 TLS 提醒的整数值（如果存在）。否则，该值将设置为 `-`。  | 
| chosen\$1cert\$1arn |  提供给客户端的证书的 ARN。如果未发送有效的客户端 hello 消息，则此值设置为 `-`。  | 
| chosen\$1cert\$1serial |  留待将来使用。此值始终设置为 `-`。  | 
| tls\$1cipher |  与客户端协商的密码套件（采用 OpenSSL 格式）。如果 TLS 协商未完成，则此值设置为 `-`。  | 
| tls\$1protocol\$1version |  与客户端协商的 TLS 协议（采用字符串格式）。可能的值为 `tlsv10`、`tlsv11`、`tlsv12` 和 `tlsv13`。如果 TLS 协商未完成，则此值设置为 `-`。  | 
| tls\$1keyex |  TLS 或 PQ-TLS 握手期间使用的密钥交换。如果 TLS 或 PQ-TLS 协商未完成，则此值将设置为。`-`  | 
| domain\$1name |  客户端 hello 消息中的 server\$1name 扩展名的值。此值是 URL 编码的。如果未发送有效的客户端 hello 消息或扩展名不存在，则此值设置为 `-`。  | 
| alpn\$1fe\$1protocol |  与客户端协商的应用程序协议，采用字符串格式。可能的值为`h2`、`http/1.1`和`http/1.0`。如果 TLS 侦听器中未配置 ALPN 策略、找不到匹配协议或者没有发送有效的协议列表，则此值设置为 `-`。  | 
| alpn\$1be\$1protocol |  与目标协商的应用程序协议，采用字符串格式。可能的值为`h2`、`http/1.1`和`http/1.0`。如果 TLS 侦听器中未配置 ALPN 策略、找不到匹配协议或者没有发送有效的协议列表，则此值设置为 `-`。  | 
| alpn\$1client\$1preference\$1list |  客户端 hello 消息中 application\$1layer\$1protocol\$1negotiation 扩展的值。此值是 URL 编码的。每个协议都用双引号括起来，协议用逗号分隔。如果在 TLS 侦听器中未配置 ALPN 策略、未发送有效的客户端 hello 消息或扩展名不存在，则此值设置为 `-`。字符串长度在超过 256 个字节时将会截断。  | 
| tls\$1connection\$1creation\$1time |  在 TLS 连接开始时记录的时间（采用 ISO 8601 格式）。  | 

### 示例日志条目


以下是示例日志条目。请注意，文本以多行形式显示只是为了更方便阅读。

以下是没有 ALPN 策略的 TLS 侦听器的示例。

```
tls 2.0 2018-12-20T02:59:40 net/my-network-loadbalancer/c6e77e28c25b2234 g3d4b5e8bb8464cd 
72.21.218.154:51341 172.100.100.185:443 5 2 98 246 - 
arn:aws:acm:us-east-2:671290407336:certificate/2a108f19-aded-46b0-8493-c63eb1ef4a99 - 
ECDHE-RSA-AES128-SHA tlsv12 - 
my-network-loadbalancer-c6e77e28c25b2234.elb.us-east-2.amazonaws.com
- - - 2018-12-20T02:59:30
```

以下是具有 ALPN 策略的 TLS 侦听器的示例。

```
tls 2.0 2020-04-01T08:51:42 net/my-network-loadbalancer/c6e77e28c25b2234 g3d4b5e8bb8464cd 
72.21.218.154:51341 172.100.100.185:443 5 2 98 246 - 
arn:aws:acm:us-east-2:671290407336:certificate/2a108f19-aded-46b0-8493-c63eb1ef4a99 - 
ECDHE-RSA-AES128-SHA tlsv12 - 
my-network-loadbalancer-c6e77e28c25b2234.elb.us-east-2.amazonaws.com
h2 h2 "h2","http/1.1" 2020-04-01T08:51:20
```

## 处理访问日志文件


访问日志文件是压缩文件。如果您使用 Amazon S3 控制台打开这些文件，则将对其进行解压缩，并且将显示信息。如果您下载这些文件，则必须对其进行解压才能查看信息。

如果您的网站上有大量需求，则负载均衡器可以生成包含大量数据的日志文件 (以 GB 为单位)。您可能无法使用处理来 line-by-line处理如此大量的数据。因此，您可能必须使用提供并行处理解决方案的分析工具。例如，您可以使用以下分析工具分析和处理访问日志：
+ Amazon Athena 是一种交互式查询服务，让您能够轻松使用标准 SQL 分析 Amazon S3 中的数据。有关更多信息，请参阅*《Amazon Athena 用户指南》*中的[查询网络负载均衡器日志](https://docs.aws.amazon.com/athena/latest/ug/networkloadbalancer-classic-logs.html)。
+ [Loggly](https://documentation.solarwinds.com/en/success_center/loggly/content/admin/s3-ingestion-auto.htm)
+ [Splunk](https://splunk.github.io/splunk-add-on-for-amazon-web-services/)
+ [Sumo Logic](https://www.sumologic.com/application/elb/)

# 为网络负载均衡器启用访问日志
启用访问日志

在为负载均衡器启用访问日志记录时，您必须指定负载均衡器将在其中存储日志的 S3 存储桶的名称。存储桶必须具有为 Elastic Load Balancing 授予写入存储桶的权限的存储桶策略。

**重要**  
仅当负载均衡器具有 TLS 侦听器且日志仅包含有关 TLS 请求的信息时，才创建访问日志。

## 存储桶要求


您可以使用现有存储桶，也可以创建专门用于访问日志的存储桶。存储桶必须满足以下要求。

**要求**
+ 存储桶必须位于与负载均衡器相同的区域中。该存储桶和负载均衡器可由不同的账户拥有。
+ 您指定的前缀不得包含 `AWSLogs`。我们会在您指定的存储桶名称和前缀后添加以 `AWSLogs` 开头的文件名部分。
+ 存储桶必须具有授予将访问日志写入存储桶的权限的存储桶策略。存储桶策略是 JSON 语句的集合，这些语句以访问策略语言编写，用于为存储桶定义访问权限。

**存储桶策略的示例**  
以下是示例策略。对于`Resource`元素，请*amzn-s3-demo-destination-bucket*替换为访问日志的 S3 存储桶的名称。*Prefix/*如果您未使用存储桶前缀，请务必省略。对于`aws:SourceAccount`，请指定负载均衡器 AWS 账户的 ID。对于`aws:SourceArn`，将*region*和*012345678912*，分别替换为负载均衡器的区域和账户 ID。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "AWSLogDeliveryWrite",
    "Statement": [
        {
            "Sid": "AWSLogDeliveryAclCheck",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:GetBucketAcl",
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": [
                        "012345678912"
                    ]
                },
                "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:logs:us-east-1:012345678912:*"
                    ]
                }
            }
        },
        {
            "Sid": "AWSLogDeliveryWrite",
            "Effect": "Allow",
            "Principal": {
                "Service": "delivery.logs.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::amzn-s3-demo-destination-bucket/Prefix/AWSLogs/account-ID/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control",
                    "aws:SourceAccount": [
                        "012345678912"
                    ]
                },
                "ArnLike": {
                    "aws:SourceArn": [
                        "arn:aws:logs:us-east-1:012345678912:*"
                    ]
                }
            }
        }
    ]
}
```

------<a name="access-log-bucket-encryption"></a>

**加密**

您可以使用下列任何一种方式为 Amazon S3 访问日志存储桶启用服务器端加密：
+ Amazon S3 托管式密钥（SSE-S3）
+ AWS KMS 存储在 AWS Key Management Service (SSE-KMS) 中的密钥†

† 对于 Network Load Balancer 访问日志，您无法使用 AWS 托管密钥，必须使用客户托管密钥。

*有关更多信息，请参阅 [Amazon S3 用户指南中的指定 Amazon S3 加密 (SSE-S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-s3-encryption.html) [和使用 AWS KMS (SSE-KMS) 指定服务器端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/specifying-kms-encryption.html)。*

密钥策略必须允许服务对日志进行加密和解密。以下是示例策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "delivery.logs.amazonaws.com"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:ReEncrypt*",
        "kms:GenerateDataKey*",
        "kms:DescribeKey"
      ],
      "Resource": "*"
    }
  ]
}
```

------

## 配置访问日志


使用以下过程配置访问日志，以捕获请求信息并将日志文件传输到 S3 存储桶。

------
#### [ Console ]

**启用访问日志**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择您的负载均衡器的名称以打开其详细信息页面。

1. 在**属性**选项卡上，选择**编辑**。

1. 对于**监控**，打开**访问日志**。

1. 对于 **S3 URI**，输入日志文件的 S3 URI。您指定的 URI 取决于您是否使用前缀。
   + 带有前缀的 URI: s3:/*amzn-s3-demo-logging-bucket*/*logging-prefix*
   + 不带前缀的 URI: s3://*amzn-s3-demo-logging-bucket*

1. 选择**保存更改**。

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

**启用访问日志**  
使用带有相关属性的[modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html)命令。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn load-balancer-arn \
    --attributes \
        Key=access_logs.s3.enabled,Value=true \
        Key=access_logs.s3.bucket,Value=amzn-s3-demo-logging-bucket \
        Key=access_logs.s3.prefix,Value=logging-prefix
```

------
#### [ CloudFormation ]

**启用访问日志**  
更新[AWS::ElasticLoadBalancingV2::LoadBalancer](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-elasticloadbalancingv2-loadbalancer.html)资源以包含相关属性。

```
Resources:
  myLoadBalancer:
    Type: 'AWS::ElasticLoadBalancingV2::LoadBalancer'
    Properties:
      Name: my-nlb
      Type: network
      Scheme: internal
      Subnets: 
        - !Ref subnet-AZ1
        - !Ref subnet-AZ2
      SecurityGroups: 
        - !Ref mySecurityGroup
      LoadBalancerAttributes: 
        - Key: "access_logs.s3.enabled"
          Value: "true"
        - Key: "access_logs.s3.bucket"
          Value: "amzn-s3-demo-logging-bucket"
        - Key: "access_logs.s3.prefix"
          Value: "logging-prefix"
```

------

# 禁用网络负载均衡器的访问日志
禁用访问日志

您随时可为您的负载均衡器禁用访问日志记录。在禁用访问日志记录后，您的访问日志将在 S3 存储桶中保留，直至您将其删除。有关更多信息，请参阅*《Amazon S3 用户指南》*中的[创建、配置和使用 S3 存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html)。

------
#### [ Console ]

**要禁用访问日志**

1. 打开位于 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 的 Amazon EC2 控制台。

1. 在导航窗格中，选择**负载均衡器**。

1. 选择您的负载均衡器的名称以打开其详细信息页面。

1. 在**属性**选项卡上，选择**编辑**。

1. 对于**监控**，关闭**访问日志**。

1. 选择**保存更改**。

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

**要禁用访问日志**  
使用 [modify-load-balancer-attributes](https://docs.aws.amazon.com/cli/latest/reference/elbv2/modify-load-balancer-attributes.html) 命令。

```
aws elbv2 modify-load-balancer-attributes \
    --load-balancer-arn load-balancer-arn \
    --attributes Key=access_logs.s3.enabled,Value=false
```

------