Elastic Load Balancing
应用程序负载均衡器
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

应用程序负载均衡器的访问日志

Elastic Load Balancing 提供了访问日志,该访问日志可捕获有关发送到负载均衡器的请求的详细信息。每个日志都包含信息 (例如,收到请求的时间、客户端的 IP 地址、延迟、请求路径和服务器响应)。您可以使用这些访问日志分析流量模式并解决问题。

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

使用访问日志无需额外付费。您将需要支付 Amazon S3 的存储费用,但无需为 Elastic Load Balancing 用来将日志文件发送到 Amazon S3 的带宽付费。有关存储成本的更多信息,请参阅 Amazon S3 定价

访问日志文件

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

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

bucket[/prefix]/AWSLogs/aws-account-id/elasticloadbalancing/region/yyyy/mm/dd/aws-account-id_elasticloadbalancing_region_load-balancer-id_end-time_ip-address_random-string.log.gz
存储桶

S3 存储桶的名称。

前缀

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

aws-account-id

拥有者的 AWS 账户 ID。

区域

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

yyyy/mm/dd

传输日志的日期。

load-balancer-id

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

end-time

日志记录间隔结束的日期和时间。例如,结束时间 20140215T2340Z 包含在 23:35 和 23:40 之间发出的请求的条目。

ip-address

处理请求的负载均衡器节点的 IP 地址。对于内部负载均衡器,这是私有 IP 地址。

random-string

系统生成的随机字符串。

以下是示例日志文件名:

s3://my-bucket/prefix/AWSLogs/123456789012/elasticloadbalancing/us-west-2/2016/05/01/123456789012_elasticloadbalancing_us-west-2_my-loadbalancer_20140215T2340Z_172.160.001.192_20sg8hgm.log.gz

日志文件可以在存储桶中存储任意长时间,不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的对象生命周期管理

访问日志条目

Elastic Load Balancing 会记录发送给负载均衡器的请求,包括从未到达目标的请求。例如,如果客户端发送格式错误的请求或者没有正常的目标响应请求,仍会记录请求。请注意,Elastic Load Balancing 不记录运行状况检查请求。

对于 WebSockets,仅在关闭连接后写入条目。如果无法建立升级后的连接,则 HTTP 或 HTTPS 请求的条目相同。

重要

Elastic Load Balancing 将尽力记录请求。我们建议您使用访问日志来了解请求性质,而不是作为所有请求的完整描述。

语法

每个日志条目均包含向负载均衡器发出的一个请求 (如果使用 WebSockets,则为连接) 的详细信息。日志条目中的所有字段用空格分隔。日志文件中的每个条目都遵循以下格式:

type timestamp elb client:port target:port request_processing_time target_processing_time response_processing_time elb_status_code target_status_code received_bytes sent_bytes "request" "user_agent" ssl_cipher ssl_protocol target_group_arn trace_id domain_name chosen_cert_arn

您应忽略日志条目结尾的任何不需要的字段。

下表描述了访问日志条目的字段。

字段 说明

type

请求或连接的类型。可能的值如下 (忽略任何其他值):

  • http - HTTP

  • https - HTTP over SSL/TLS

  • h2 - HTTP/2 over SSL/TLS

  • ws - WebSockets

  • wss - WebSockets over SSL/TLS

timestamp

负载均衡器生成对客户端的响应的时间 (采用 ISO 8601 格式)。对于 WebSockets,这是关闭连接的时间。

elb

负载均衡器的资源 ID。如果您正在解析访问日志条目,请注意,资源 ID 可包含正斜杠 (/)。

client:port

请求客户端的 IP 地址和端口。

target:port

处理此请求的目标的 IP 地址和端口。

如果客户端没有发送完整请求,则负载均衡器无法将请求分派到目标,并且此值设置为 -

如果 AWS WAF 拦截了此请求,该值会被设置为 -,且 elb_status_code 的值会被设置为 403。

request_processing_time

从负载均衡器收到请求到将请求发送到目标所用的总时间 (以秒为单位)。

如果负载均衡器无法将请求分派到目标,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。

target_processing_time

从负载均衡器将请求发送到目标到该目标开始发送响应标头所用的总时间 (以秒为单位)。

如果负载均衡器无法将请求分派到目标,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。

response_processing_time

从负载均衡器收到来自目标的响应标头到开始向客户端发送响应所用的总时间 (以秒为单位)。此时间包括在负载均衡器上的排队时间以及从负载均衡器到客户端的连接获取时间。

如果负载均衡器无法将请求发送到目标,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。

elb_status_code

来自负载均衡器的响应的状态代码。

target_status_code

来自目标的响应的状态代码。仅在已建立与目标的连接且目标已发送响应的情况下记录此值。否则,该值将设置为 -

received_bytes

从客户端 (申请方) 接收的请求大小 (以字节为单位)。对于 HTTP 请求,这包括标头。对于 WebSockets,这是通过连接从客户端接收的字节总数。

sent_bytes

发送到客户端 (申请方) 的响应的大小 (以字节为单位)。对于 HTTP 请求,这包括标头。对于 WebSockets,这是通过连接发送到客户端的字节总数。

请求

来自客户端的请求行,包含在双引号内并采用以下格式进行记录:HTTP 方法 + 协议://主机:端口/uri + HTTP 版本。

user_agent

标识发出请求的客户端的用户代理字符串。该字符串包含一个或多个产品标识符 (product[/version])。如果字符串长度超过 8 KB,则将被截断。

ssl_cipher

[HTTPS 侦听器] SSL 密码。仅当在成功协商后建立传入 连接时记录此值。否则,该值将设置为 -

ssl_protocol

[HTTPS 侦听器] SSL 协议。仅当在成功协商后建立传入 连接时记录此值。否则,该值将设置为 -

target_group_arn

目标组的 Amazon 资源名称 (ARN)。

trace_id

X-Amzn-Trace-Id 标头的内容。

domain_name

[HTTPS 侦听器] TLS 握手期间客户端提供的 SNI 域。如果客户端不支持 SNI 或此域与证书不匹配且将向客户端提供默认证书,则此值将设置为 -

chosen_cert_arn

[HTTPS 侦听器] 向客户端提供的证书的 ARN。

示例

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

示例 HTTP 条目

以下是 HTTP 侦听器 (端口 80 到端口 80) 的示例日志条目:

http 2016-08-10T22:08:42.945958Z app/my-loadbalancer/50dc6c495c0c9188 
192.168.131.39:2817 10.0.0.1:80 0.000 0.001 0.000 200 200 34 366 
"GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - - 
arn:aws-cn:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337262-36d228ad5d99923122bbe354" - -

示例 HTTPS 条目

以下是 HTTPS 侦听器 (端口 443 到端口 80) 的示例日志条目:

https 2016-08-10T23:39:43.065466Z app/my-loadbalancer/50dc6c495c0c9188 
192.168.131.39:2817 10.0.0.1:80 0.086 0.048 0.037 200 200 0 57 
"GET https://www.example.com:443/ HTTP/1.1" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 
arn:aws-cn:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337281-1d84f3d73c47ec4e58577259" www.example.com arn:aws:acm:us-west-2:123456789012:certificate/12345678-1234-1234-1234-123456789012

示例 HTTP/2 条目

以下是 HTTP/2 流的示例日志条目。

h2 2016-08-10T00:10:33.145057Z app/my-loadbalancer/50dc6c495c0c9188 
10.0.1.252:48160 10.0.0.66:9000 0.000 0.002 0.000 200 200 5 257 
"GET https://10.0.2.105:773/ HTTP/2.0" "curl/7.46.0" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2
arn:aws-cn:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337327-72bd00b0343d75b906739c42" - -

示例 WebSockets 条目

以下是 WebSockets 连接的示例日志条目。

ws 2016-08-10T00:32:08.923954Z app/my-loadbalancer/50dc6c495c0c9188 
10.0.0.140:40914 10.0.1.192:8010 0.001 0.003 0.000 101 101 218 587 
"GET http://10.0.0.30:80/ HTTP/1.1" "-" - - 
arn:aws-cn:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" - -

安全 WebSockets 条目示例

以下是安全 WebSockets 连接的示例日志条目。

wss 2016-08-10T00:42:46.423695Z app/my-loadbalancer/50dc6c495c0c9188 
10.0.0.140:44244 10.0.0.171:8010 0.000 0.001 0.000 101 101 218 786
"GET https://10.0.0.30:443/ HTTP/1.1" "-" ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 
arn:aws-cn:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" - -

存储桶权限

在启用访问日志记录时,您必须为访问日志指定 S3 存储桶。此存储桶必须位于负载均衡器所在的区域,并且必须具有向 Elastic Load Balancing 授予向存储桶写入访问日志的权限的存储桶策略。存储桶策略是 JSON 语句的集合,这些语句以访问策略语言编写,用于为存储桶定义访问权限。每个语句都包括有关单个权限的信息并包含一系列元素。

重要

如果您将使用控制台启用访问日志记录,则可跳至启用访问日志记录。如果您将使用 AWS CLI 或 API 启用访问日志记录,则存储桶必须存在且必须具有所需的存储桶策略。

如果您需要为访问日志创建存储桶,请使用以下过程创建存储桶并添加所需的存储桶策略。如果您已拥有存储桶,请从步骤 4 开始以添加或更新存储桶的存储桶策略。

使用所需权限创建 Amazon S3 存储桶

  1. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

  2. 选择 Create Bucket

  3. Create a Bucket (创建存储桶) 对话框中,执行以下操作:

    1. 对于 Bucket Name,输入您的存储桶的名称 (例如 my-loadbalancer-logs)。此名称在 Amazon S3 内所有现有存储桶名称中必须唯一。在某些区域,可能对存储桶名称有其他限制。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的存储桶局限和限制

    2. 对于 Region,选择在其中创建负载均衡器的区域。

    3. 选择 Create

  4. 选择存储桶,然后选择 Permissions

  5. 选择 Bucket Policy。如果存储桶具有已附加策略,您可以将所需的语句添加到现有策略中。

  6. 选择 Policy generator。在 AWS Policy Generator 页面上,执行以下操作:

    1. 对于 Select Type of Policy,选择 S3 Bucket Policy

    2. 对于 Effect,选择 Allow

    3. 对于 Principal,指定下列 AWS 账户 ID 之一以向 Elastic Load Balancing 授予对 S3 存储桶的访问权限。使用与您的负载均衡器和存储桶所在区域对应的账户 ID。

      区域 区域名称 Elastic Load Balancing 账户 ID
      us-east-1 美国东部(弗吉尼亚北部) 127311923021
      us-east-2 美国东部(俄亥俄州) 033677994240
      us-west-1 美国西部(加利福尼亚北部) 027434742980
      us-west-2 美国西部(俄勒冈) 797873946194
      ca-central-1 加拿大 (中部) 985666609251
      eu-west-1 欧洲(爱尔兰) 156460612806
      eu-central-1 欧洲(法兰克福) 054676820928
      eu-west-2 欧洲 (伦敦) 652711504416
      ap-northeast-1 亚太区域(东京) 582318560864
      ap-northeast-2 亚太区域(首尔) 600734575887
      ap-southeast-1 亚太区域(新加坡) 114774131450
      ap-southeast-2 亚太区域(悉尼) 783225319266
      ap-south-1 亚太地区(孟买) 718504428378
      sa-east-1 南美洲(圣保罗) 507241528517
      us-gov-west-1* AWS GovCloud(美国) 048591011584
      cn-north-1* 中国(北京) 638102146993

      * 这些区域需要单独的账户。有关更多信息,请参阅 AWS GovCloud(美国)中国(北京)

    4. 对于 Actions,选择 PutObject 以允许 Elastic Load Balancing 将对象存储在 S3 存储桶中。

    5. 对于 Amazon Resource Name (ARN),采用以下格式输入 S3 存储桶的 ARN。对于 aws-account-id,指定拥有负载均衡器的 AWS 账户的 ID (例如 123456789012)。

      arn:aws-cn:s3:::bucket/prefix/AWSLogs/aws-account-id/*

      请注意,如果您使用的是 us-gov-west-1 区域,请在 ARN 中指定 arn:aws-us-gov 而非 arn:aws

    6. 依次选择 Add StatementGenerate Policy。该策略文档应该类似于以下内容:

      {
        "Id": "Policy1429136655940",
        "Version": "2012-10-17",
        "Statement": [
          {
            "Sid": "Stmt1429136633762",
            "Action": [
              "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws-cn:s3:::my-loadbalancer-logs/my-app/AWSLogs/123456789012/*",
            "Principal": {
              "AWS": [
                "797873946194"
              ]
            }
          }
        ]
      }
    7. 如果您创建新的存储桶策略,请复制整个策略文档,然后选择 Close

      如果您正在编辑现有存储桶策略,请复制策略文档中的新语句 (Statement 元素的 [ 和 ] 之间的文本),然后选择 Close

  7. 返回 Amazon S3 控制台,并将策略粘贴到适当的文本区域中。

  8. 选择 Save

启用访问日志记录

在为负载均衡器启用访问日志记录时,您必须指定负载均衡器将在其中存储日志的 S3 存储桶的名称。存储桶必须位于负载均衡器所在的区域,并且必须具有向 Elastic Load Balancing 授予在存储桶中写入访问日志的权限的存储桶策略。该存储桶可由与拥有负载均衡器的账户不同的账户拥有。

使用控制台启用访问日志记录

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Load Balancers

  3. 选择您的负载均衡器。

  4. Description 选项卡上,选择 Edit attributes

  5. Edit load balancer attributes 页面上,执行以下操作:

    1. 选择 Enable access logs

    2. 对于 S3 location,键入 S3 存储桶的名称,包括任何前缀 (例如,my-loadbalancer-logs/my-app)。您可以指定现有存储桶的名称或新存储桶名称。

    3. (可选) 如果存储桶不存在,请选择 Create this location for me。您必须指定在 Amazon S3 中的所有现有存储桶名称中唯一的名称,并遵循 DNS 命名约定。有关更多信息,请参阅 Amazon Simple Storage Service 开发人员指南 中的存储桶命名规则

    4. 选择 Save

使用 AWS CLI 启用访问日志记录

使用 modify-load-balancer-attributes 命令。

验证 Elastic Load Balancing 是否在 S3 存储桶中创建了测试文件

在为负载均衡器启用访问日志记录后,Elastic Load Balancing 将验证 S3 存储桶,并创建测试文件以确保存储桶策略指定所需权限。您可以使用 Amazon S3 控制台验证是否已创建测试文件。请注意,测试文件不是实际的访问日志文件;它不包含示例记录。

  1. 通过以下网址打开 Amazon S3 控制台:https://console.amazonaws.cn/s3/

  2. 对于 All Buckets,选择您的 S3 存储桶。

  3. 导航到测试日志文件。路径应如下所示:

    my-bucket/prefix/AWSLogs/123456789012/ELBAccessLogTestFile

禁用访问日志记录

您随时可为您的负载均衡器禁用访问日志记录。在禁用访问日志记录后,您的访问日志将在 S3 存储桶中保留,直至您将其删除。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南 中的使用存储桶

使用控制台禁用访问日志记录

  1. 打开 Amazon EC2 控制台 https://console.amazonaws.cn/ec2/

  2. 在导航窗格中,选择 Load Balancers

  3. 选择您的负载均衡器。

  4. Description 选项卡上,选择 Edit attributes

  5. Edit load balancer attributes 页面上,清除 Enable access logs

  6. 选择 Save

使用 AWS CLI 禁用访问日志记录

使用 modify-load-balancer-attributes 命令。

处理访问日志文件

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

如果您的网站上有大量需求,则负载均衡器可以生成包含大量数据的日志文件 (以 GB 为单位)。您可能无法通过逐行处理来处理数量如此庞大的数据。因此,您可能必须使用提供并行处理解决方案的分析工具。例如,您可以使用以下分析工具分析和处理访问日志: