本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Application Load Balancer 的访问日志
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
_app.load-balancer-id
_end-time
_ip-address
_random-string
.log.gz
- bucket
-
S3 存储桶的名称。
- prefix
-
(可选)存储桶的前缀(逻辑层级结构)。您指定的前缀不得包含字符串
AWSLogs
。要获取更多信息,请参阅使用前缀整理对象。 AWSLogs
-
我们会在您指定的存储桶名称和可选前缀后添加以
AWSLogs
开头的文件名部分。 - aws-account-id
-
所有者的 AWS 账户 ID。
- region
-
负载均衡器和 S3 存储桶所在的区域。
- yyyy/mm/dd
-
传输日志的日期。
- load-balancer-id
-
负载均衡器的资源 ID。如果资源 ID 包含任何正斜杠 (/),这些正斜杠将替换为句点 (.)。
- end-time
-
日志记录间隔结束的日期和时间。例如,20140215T2340Z 的结束时间包含在祖鲁时间 23:35 到 23:40 之间提出的请求的UTC条目。
- ip-address
-
处理请求的负载均衡器节点的 IP 地址。对于内部负载均衡器,这是私有 IP 地址。
- random-string
-
系统生成的随机字符串。
以下是一个带前缀的日志文件名示例:
s3://amzn-s3-demo-logging-bucket/logging-prefix/AWSLogs/123456789012/elasticloadbalancing/us-east-2/2022/05/01/123456789012_elasticloadbalancing_us-east-2_app.my-loadbalancer.1234567890abcdef_20220215T2340Z_172.160.001.192_20sg8hgm.log.gz
以下是一个不带前缀的日志文件名示例:
s3://amzn-s3-demo-logging-bucket/AWSLogs/123456789012/elasticloadbalancing/us-east-2/2022/05/01/123456789012_elasticloadbalancing_us-east-2_app.my-loadbalancer.1234567890abcdef_20220215T2340Z_172.160.001.192_20sg8hgm.log.gz
日志文件可以在存储桶中存储任意长时间,不过您也可以定义 Amazon S3 生命周期规则以自动存档或删除日志文件。有关更多信息,请参阅 Amazon Simple Storage Service 用户指南中的对象生命周期管理。
访问日志条目
Elastic Load Balancing 会记录发送给负载均衡器的请求,包括从未到达目标的请求。例如,如果客户端发送格式错误的请求或者没有正常的目标响应请求,仍会记录请求。Elastic Load Balancing 不记录运行状况检查请求。
每个日志条目都包含向负载均衡器发出的单个请求(如果是连接 WebSockets)的详细信息。对于 WebSockets,只有在连接关闭后才会写入条目。如果无法建立升级后的连接,则该条目与HTTP或HTTPS请求的条目相同。
重要
Elastic Load Balancing 将尽力记录请求。我们建议您使用访问日志来了解请求性质,而不是作为所有请求的完整描述。
语法
下表按顺序描述了访问日志条目的字段。使用空格分隔所有字段。在引入新的字段时,会将这些字段添加到日志条目的末尾。您应忽略日志条目结尾的任何不需要的字段。
字段 | 描述 |
---|---|
类型 |
请求或连接的类型。可能的值如下 (忽略任何其他值):
|
时间 |
负载均衡器生成对客户端的响应的时间,格式ISO为 8601。因为 WebSockets,这是连接关闭的时间。 |
elb |
负载均衡器的资源 ID。如果您正在解析访问日志条目,请注意资源IDs可以包含正斜杠 (/)。 |
client:port |
请求客户端的 IP 地址和端口。如果负载均衡器前面有代理,则此字段将会包含该代理的 IP 地址。 |
target:port |
处理此请求的目标的 IP 地址和端口。 如果客户端没有发送完整请求,则负载均衡器无法将请求分派到目标,并且此值设置为 -。 如果目标是 Lambda 函数,则此值设置为 -。 如果请求被阻止 AWS WAF,则此值设置为-,elb_status_code 的值设置为 403。 |
request_processing_time |
从负载均衡器收到请求到将请求发送到目标所用的总时间(以秒为单位,精度为毫秒)。 如果负载均衡器无法将请求分派到目标,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。 如果在达到 10 秒的连接超时之前无法与目标建立TCP连接,则也可以将此值设置为-TCP 1。 如果您 AWS WAF 的 Application Load Balancer 启用或目标类型是 Lambda 函数,则将客户端发送POST请求所需数据所花费的时间计入。 |
target_processing_time |
从负载均衡器将请求发送到目标到该目标开始发送响应标头所用的总时间(以秒为单位,精度为毫秒)。 如果负载均衡器无法将请求分派到目标,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。 如果注册目标在空闲超时之前未响应,则此值还可设置为 -1。 如果您 AWS WAF 的 Application Load Balancer 未启用,则将计入客户端发送POST请求所需数据所花费的时间 |
response_processing_time |
从负载均衡器收到来自目标的响应标头到开始向客户端发送响应所用的总时间(以秒为单位,精度为毫秒)。此时间包括在负载均衡器上的排队时间以及从负载均衡器到客户端的连接获取时间。 如果负载平衡器没有接收到来自目标的响应,则此值设置为 -1。如果目标在空闲超时前关闭连接,或客户端发送了格式错误的请求,则会发生这种情况。 |
elb_status_code |
由负载均衡器生成的响应的状态码、固定响应规则或阻止操作的 AWS WAF 自定义响应代码。 |
target_status_code |
来自目标的响应的状态代码。仅在已建立与目标的连接且目标已发送响应的情况下记录此值。否则,其设置为 -。 |
received_bytes |
从客户端 (申请方) 接收的请求大小 (以字节为单位)。对于HTTP请求,这包括标头。对于 WebSockets,这是连接时从客户端接收的总字节数。 |
sent_bytes |
发送到客户端 (申请方) 的响应的大小 (以字节为单位)。对于HTTP请求,这包括标头。对于 WebSockets,这是在连接上发送给客户端的总字节数。 |
"request" |
来自客户端的请求行,用双引号括起来,并使用以下格式记录:m HTTP ethod + protocol: //host: port/uri + 版本。HTTP在记录请求URI时,负载均衡器会按原样保留客户端URL发送的信息。它不设置访问日志文件的内容类型。处理此字段时,请考虑客户是如何发送的URL。 |
"user_agent" |
标识发出请求的客户端的用户代理字符串(用双引号括起来)。该字符串包含一个或多个产品标识符 (product[/version])。如果字符串长度超过 8 KB,则将被截断。 |
ssl_cipher |
[HTTPS听众] SSL 密码。如果监听器不是监听器,则此值设置为-。HTTPS |
ssl_protocol |
[HTTPS监听器] SSL 协议。如果监听器不是监听器,则此值设置为-。HTTPS |
target_group_arn |
目标群组的 Amazon 资源名称 (ARN)。 |
"trace_id" |
X-Amzn-Trace-Id 标头的内容(用双引号括起来)。 |
"domain_name" |
[li HTTPS stener] TLS 握手期间客户端提供的SNI域,用双引号括起来。如果客户端不支持SNI或域名与证书不匹配并且向客户端提供默认证书,则此值设置为-。 |
"chosen_cert_arn" |
[HTTPSlistener] 提交给客户端的证书,用双引号括起来。ARN如果重复使用会话,则将此值设置为 |
matched_rule_priority |
匹配请求的规则的优先级值。如果匹配了某个规则,则此值的范围介于 1 和 50000 之间。如果未匹配任何规则并且已执行默认操作,则此值设置为 0。如果错误发生在规则评估时,则它设置为 -1。对于任何其他错误,它设置为 -。 |
request_creation_time |
负载均衡器收到来自客户端的请求的时间,格式ISO为 8601。 |
"actions_executed" |
处理请求时执行的操作(用双引号括起来)。此值是一个逗号分隔的列表,可以包含 采取的操作 中所描述的值。如果未执行任何操作(例如,针对格式错误的请求的操作),则此值设置为 - 。 |
"redirect_url" |
HTTP响应位置标头的重定向目标,用双引号括起来。URL如果不执行重定向操作,则此值设置为 -。 |
"error_reason" |
错误原因代码(包含在双引号内)。如果请求失败,则这是 错误原因代码 中描述的错误代码之一。如果所采取的操作不包含身份验证操作或目标不是 Lambda 函数,则此值设置为 -。 |
“target:port_list” |
处理此请求的目标的 IP 地址和端口的列表,各个地址和端口之间用空格分隔,并且用双引号括起。当前,此列表可以包含一个项,并且与 target:port 字段匹配。 如果客户端没有发送完整请求,则负载均衡器无法将请求分派到目标,并且此值设置为 -。 如果目标是 Lambda 函数,则此值设置为 -。 如果请求被阻止 AWS WAF,则此值设置为-,elb_status_code 的值设置为 403。 |
“target_status_code_list” |
目标响应的状态代码列表,代码之间用空格分隔,并且用双引号括起来。当前,此列表可以包含一个项,并且与 target_status_code 字段匹配。 仅在已建立与目标的连接且目标已发送响应的情况下记录此值。否则,其设置为 -。 |
"classification" |
异步缓解的分类(包含在双引号内)。如果请求不符合 RFC 7230,则可能的值为 “可接受”、“模棱两可” 和 “严重”。 如果请求符合 RFC 7230,则此值设置为-。 |
"classification_reason" |
分类原因代码(包含在双引号内)。如果请求不符合 RFC 7230,则这是中分类原因描述的分类代码之一。如果请求符合 RFC 7230,则此值设置为-。 |
conn_trace_id |
连接可追溯性 ID 是一个唯一的不透明 ID,用于标识每个连接。与客户机建立连接后,来自该客户端的后续请求将在各自的访问日志条目中包含此 ID。此 ID 充当外键,用于在连接和访问日志之间创建链接。 |
采取的操作
负载均衡器将其采取的操作存储在访问日志的 actions_executed 字段中。
-
authenticate
– 负载均衡器验证会话,验证用户身份,并将用户信息添加到规则配置所指定的请求标头中。 -
fixed-response
– 负载均衡器发出规则配置所指定的固定响应。 -
forward
– 负载均衡器将请求转发到规则配置所指定的目标。 -
redirect
— 根据规则配置的指定,负载均衡器将请求重定向到另一个URL负载均衡器。 -
waf
— 负载均衡器将请求转发到 AWS WAF 以确定是否应将请求转发到目标。如果这是最终操作,则 AWS WAF 决定应拒绝该请求。默认情况下,被拒绝的请求 AWS WAF 将在该字段中记录为 “403”。elb_status_code
当配置 AWS WAF 为拒绝使用自定义响应代码的请求时,该elb_status_code
字段将反映配置的响应代码。 -
waf-failed
— 负载均衡器尝试将请求转发到 AWS WAF,但此过程失败。
分类原因
如果请求不符合 RFC 7230,则负载均衡器会在访问日志的 classition_reason 字段中存储以下代码之一。有关更多信息,请参阅 异步缓解模式。
代码 | 描述 | 分类 |
---|---|---|
|
该请求URI包含控制字符。 |
不明确 |
|
Content-Length 标头包含一个无法解析或不是有效数字的值。 |
严重 |
|
标头包含 Null 字符或回车符。 |
严重 |
|
Transfer-Encoding 标头包含错误的值。 |
严重 |
|
该请求URI包含空字符或回车符。 |
严重 |
|
请求方法格式不正确。 |
严重 |
|
请求版本格式不正确。 |
严重 |
|
请求同时包含 Transfer-Encoding 标头和 Content-Length 标头。 |
不明确 |
|
存在多个具有相同值的 Content-Length 标头。 |
不明确 |
|
标头是空的,或者有一行中只包含空格。 |
不明确 |
|
对于GET或HEAD请求,有一个值为 0 的 Content-Length 标头。 |
可接受 |
|
存在多个具有不同值的 Content-Length 标头。 |
严重 |
|
存在多个 Transfer-Encoding: chunked 标头。 |
严重 |
|
标头包含非字符ASCII或控制字符。 |
可接受 |
|
请求版本包含错误的值。 |
可接受 |
|
该请求URI包含未URL编码的空格。 |
可接受 |
|
有一个标头可以使用常见的文本规范化技术标准化为 Transfer-Encoding 或 Content-Length。 |
不明确 |
|
为GET或HEAD请求定义了内容长度标头。 |
不明确 |
|
为GET或HEAD请求定义了传输编码标头。 |
不明确 |
错误原因代码
如果负载均衡器无法完成身份验证操作,则负载均衡器会在访问日志的 error_reason 字段中存储以下原因代码之一。负载均衡器还会增加相应的 CloudWatch 指标。有关更多信息,请参阅 使用 Application Load Balancer 验证用户身份。
代码 | 描述 | 指标 |
---|---|---|
|
身份验证 Cookie 无效。 |
|
|
来自令牌终端节点的授权授予代码无效。 |
|
|
ID 令牌无效。 |
|
|
状态参数无效。 |
|
|
来自令牌终端节点的响应无效。 |
|
|
来自用户信息终端节点的响应无效。 |
|
|
来自授权终端节点的身份验证响应缺少名为“code”的查询参数。 |
|
|
来自授权终端节点的身份验证响应缺少主机标头字段。 |
|
|
来自授权终端节点的身份验证响应缺少名为“state”的查询参数。 |
|
|
令牌终端节点存在错误响应(非 2XX)。 |
|
|
负载均衡器无法与令牌终端节点通信。 |
|
|
负载均衡器遇到未处理的异常。 |
|
|
IdP 用户信息终端节点存在错误响应(非 2XX)。 |
|
|
负载均衡器无法与 IdP 用户信息终端节点通信。 |
|
|
IdP 返回的声明大小超过 11 K 字节。 |
|
如果对加权目标组的请求失败,则负载均衡器会在访问日志的 error_reason 字段中存储下列错误代码之一。
代码 | 描述 |
---|---|
|
用于加权目标群体的 AWSALBTG Cookie 无效。例如,对 Cookie 值进行URL编码时,负载均衡器会返回此错误。 |
|
负载均衡器遇到未处理的异常。 |
如果对 Lambda 函数的请求失败,则负载均衡器会在访问日志的 error_reason 字段中存储下列原因代码之一。负载均衡器还会增加相应的 CloudWatch 指标。有关更多信息,请参阅 Lambda 调用操作。
代码 | 描述 | 指标 |
---|---|---|
|
负载均衡器无权调用 Lambda 函数。 |
|
|
Lambda 调用失败,因为客户端请求标头或正文不只UTF包含 -8 个字符。 |
|
|
负载均衡器无法连接到 Lambda。 |
|
|
尝试连接到 Lambda 时发生超时。 |
|
|
在函数初始化期间,亚马逊EC2拒绝了对 Lambda 的访问。 |
|
|
亚马逊在EC2函数初始化期间限制了 Lambda。 |
|
|
Amazon 在函数初始化期间EC2遇到了意外异常。 |
|
|
Lambda 无法按照 Lambda 函数配置中VPC指定的方式创建网络接口,因为已超出网络接口的限制。 |
|
|
来自 Lambda 函数的响应的格式不正确或缺少必填字段。 |
|
|
指定版本的 Lambda 运行时不受支持。 |
|
|
Lambda 函数配置中指定的安全组 ID 无效。 |
|
|
Lambda 函数配置中指定的子网 ID 无效。 |
|
|
Lambda 无法解压缩指定的函数 zip 文件。 |
|
|
Lambda 无法解密环境变量,因为密钥访问被拒绝。KMS检查 Lambda 函数的KMS权限。 |
|
|
Lambda 无法解密环境变量,因为指定的KMS密钥已被禁用。检查 Lambda 函数的KMS密钥设置。 |
|
|
Lambda 无法解密环境变量,因为密KMS钥的状态无效。检查 Lambda 函数的KMS密钥设置。 |
|
|
由于找不到密KMS钥,Lambda 无法解密环境变量。检查 Lambda 函数的KMS密钥设置。 |
|
|
请求正文的大小已超过 1 MB。 |
|
|
找不到 Lambda 函数。 |
|
|
响应的大小已超过 1 MB。 |
|
|
Lambda 遇到了内部错误。 |
|
|
Lambda 无法为 Lambda 函数设置VPC访问权限,因为一个或多个子网没有可用的 IP 地址。 |
|
|
Lambda 函数受到限制,因为请求过多。 |
|
|
Lambda 函数遇到了未处理的异常。 |
|
|
负载均衡器遇到未处理的异常。 |
|
|
WebSockets Lambda 不支持。 |
|
如果负载均衡器在向转发请求时遇到错误 AWS WAF,它会在访问日志的 error_reason 字段中存储以下错误代码之一。
代码 | 描述 |
---|---|
|
负载均衡器无法连接到 AWS WAF。 |
|
与的连接 AWS WAF 超时。 |
|
请求 AWS WAF 超时。 |
|
AWS WAF 返回了一个 5XX 错误。 |
|
负载均衡器遇到未处理的异常。 |
示例日志条目
以下是示例日志条目。请注意,文本以多行形式显示只是为了更方便阅读。
示例HTTP条目
以下是HTTP监听器(端口 80 到端口 80)的日志条目示例:
http 2018-07-02T22:23:00.186641Z 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:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337262-36d228ad5d99923122bbe354" "-" "-"
0 2018-07-02T22:22:48.364000Z "forward" "-" "-" "10.0.0.1:80" "200" "-" "-"
示例HTTPS条目
以下是HTTPS监听器(端口 443 到端口 80)的日志条目示例:
https 2018-07-02T22:23:00.186641Z 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:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337281-1d84f3d73c47ec4e58577259" "www.example.com" "arn:aws:acm:us-east-2:123456789012:certificate/12345678-1234-1234-1234-123456789012"
1 2018-07-02T22:22:48.364000Z "authenticate,forward" "-" "-" "10.0.0.1:80" "200" "-" "-" TID_123456
示例 HTTP /2 条目
以下是 HTTP /2 流的日志条目示例。
h2 2018-07-02T22:23:00.186641Z 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:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337327-72bd00b0343d75b906739c42" "-" "-"
1 2018-07-02T22:22:48.364000Z "redirect" "https://example.com:80/" "-" "10.0.0.66:9000" "200" "-" "-"
示例 WebSockets 条目
以下是 WebSockets 连接的日志条目示例。
ws 2018-07-02T22:23:00.186641Z 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:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-"
1 2018-07-02T22:22:48.364000Z "forward" "-" "-" "10.0.1.192:8010" "101" "-" "-"
安全 WebSockets 入口示例
以下是安全 WebSockets连接的日志条目示例。
wss 2018-07-02T22:23:00.186641Z 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:elasticloadbalancing:us-west-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-"
1 2018-07-02T22:22:48.364000Z "forward" "-" "-" "10.0.0.171:8010" "101" "-" "-"
Lambda 函数的示例条目
以下是对 Lambda 函数的成功请求的示例日志条目:
http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188
192.168.131.39:2817 - 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:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-"
0 2018-11-30T22:22:48.364000Z "forward" "-" "-" "-" "-" "-" "-"
以下是对 Lambda 函数的失败请求的示例日志条目:
http 2018-11-30T22:23:00.186641Z app/my-loadbalancer/50dc6c495c0c9188
192.168.131.39:2817 - 0.000 0.001 0.000 502 - 34 366
"GET http://www.example.com:80/ HTTP/1.1" "curl/7.46.0" - -
arn:aws:elasticloadbalancing:us-east-2:123456789012:targetgroup/my-targets/73e2d6bc24d8a067
"Root=1-58337364-23a8c76965a2ef7629b185e3" "-" "-"
0 2018-11-30T22:22:48.364000Z "forward" "-" "LambdaInvalidResponse" "-" "-" "-" "-"
处理访问日志文件
访问日志文件是压缩文件。如果您下载这些文件,则必须对其进行解压才能查看信息。
如果您的网站上有大量需求,则负载均衡器可以生成包含大量数据的日志文件 (以 GB 为单位)。您可能无法使用处理来 line-by-line处理如此大量的数据。因此,您可能必须使用提供并行处理解决方案的分析工具。例如,您可以使用以下分析工具分析和处理访问日志:
-
Amazon Athena 是一项交互式查询服务,可以轻松地使用标准分析亚马逊 S3 中的数据。SQL有关更多信息,请参阅 Amazon Athena 用户指南中的查询 Application Load Balancer 日志。