部署在数据平面(即加入网格的Kubernetes集群)的Envoy Proxy可以输出所有访问日志。ASM支持自定义Envoy Proxy输出的访问日志内容。本文介绍如何自定义Envoy Proxy输出的访问日志内容。
前提条件
步骤一:启用访问日志
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在基本信息页面右上角,单击功能设置。
在功能设置更新面板,选中开启访问日志并将其打印到容器标准输出,然后单击确定。
istio-proxy容器默认输出包含以下字段的日志。如果关闭访问日志,istio-proxy容器将不会产生JSON格式的访问日志。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在可观测配置页面,按需单击全局、命名空间或自定义页签。
若您选择命名空间页签,请单击创建,按需选择命名空间。
若您选择自定义页签,请单击创建,按需选择命名空间,输入名称和匹配标签。
在日志设置区域,打开启用日志输出开关,然后单击提交。
打开开关后,服务网格数据平面Sidecar或网关会将访问日志输出至容器标准输出。ASM还支持日志过滤功能,详情请参见日志过滤。
在数据平面Sidecar容器的标准输出查看日志。
下文以使用kubectl查看访问日志为例进行说明。
执行以下命令,查看Sidecar日志。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1
执行以下命令,查看入口网关日志。
kubectl -n istio-system logs istio-ingressgateway-6cff9b6b58-r**** --tail 1
(可选)通过容器服务控制台查看访问日志。
如果您使用阿里云容器服务集群,还可以通过容器服务控制台查看访问日志。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在容器组页面,单击目标Pod名称,然后在页面下方单击日志页签,查看访问日志。
关于日志的更多信息,请参见可观测配置和启用控制平面日志采集和日志告警(新版)。
步骤二:自定义数据面访问日志内容
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在基本信息页面的配置信息区域,单击开启访问日志并将其打印到容器标准输出右侧的自定义访问日志格式。
在自定义访问日志格式对话框下方,新增自定义访问日志格式,设置变量名称为my_custom_key,变量值为%REQ(end-user)%,然后单击确认。
本文以获取Bookinfo示例中HTTP请求的Header字段end-user为例。如下图所示,自定义访问日志格式时,您可以选择ASM提供的可选字段,也可以新增自定义字段。选中目标字段后,将按照自定义的访问日志格式输出访问日志。
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在可观测配置页面,按需单击全局、命名空间或自定义页签。
若您选择命名空间页签,请单击创建,按需选择命名空间。
若您选择自定义页签,请单击创建,按需选择命名空间,输入名称和匹配标签。
在日志设置区域,按需选中字段、修改目标字段信息或在最下方日志指标右侧单击
图标,新增日志字段,然后单击提交。
只有打开启用日志输出开关,才能自定义日志格式。在日志格式区域,默认选中的日志字段为默认必选字段,不支持修改。日志字段支持从请求Header、响应Header、Envoy内置值中取值。
下文以打印请求中的accept-encoding Header为例,配置变量名称为accept-encoding,类型为请求属性,变量值为Accept-Encoding。
执行以下命令,查看服务网格数据平面组件日志。
kubectl logs httpbin-5c5944c58c-w**** -c istio-proxy --tail 1|grep accept-encoding --color=auto
可以看到步骤4新增的Accept-Encoding Header的值,已被输出至访问日志。关于日志的更多信息,请参见可观测配置和启用控制平面日志采集和日志告警(新版)。
步骤三:查看访问日志
启用访问日志后,发起请求的Sidecar容器将按照自定义的访问日志格式输出访问日志。
在浏览器地址栏输入入口网关地址:productpage,访问Productpage应用。
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在无状态页面顶部,设置命名空间为default,然后在productpage-v1应用右侧,单击操作列下的详情。
在应用详情页面,单击日志页签,设置Container为istio-proxy。
在日志输出框中可以看到如下日志。日志中包含名为jason的end-user,表明自定义日志内容成功。
访问日志字段说明
在服务网格ASM中,“上游(upstream)”表示调用链中请求的接收方,“下游(downstream)”表示请求的发起方。例如,服务A向服务B发起请求时,服务A为“下游(downstream)”,服务B为“上游(upstream)”。
变量名称 | 变量值 | 说明 |
变量名称 | 变量值 | 说明 |
authority_for | %REQ(:AUTHORITY)% | 请求中携带的目标主机名,对于HTTP 1.1请求,其对应 |
bytes_received | %BYTES_RECEIVED% |
|
bytes_sent | %BYTES_SENT% |
|
downstream_local_address | %DOWNSTREAM_LOCAL_ADDRESS% | 下游连接的目标地址和端口(可以理解为下游连接的原始目标地址)。 |
downstream_remote_address | %DOWNSTREAM_REMOTE_ADDRESS% | 下游连接的客户端地址和端口。 |
method | %REQ(:METHOD)% | 请求的方法(该字段仅HTTP有效)。 |
path | %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% | 请求的路径。 |
protocol | %PROTOCOL% | 请求的协议。 |
request_id | %REQ(X-REQUEST-ID)% | 本次请求的唯一ID。 |
requested_server_name | %REQUESTED_SERVER_NAME% | SSL连接中设置的服务端名称(SNI)。 |
response_code | %RESPONSE_CODE% | HTTP请求返回码。 |
response_flags | %RESPONSE_FLAGS% | 关于响应或者连接的额外信息,取值和对应含义,请参考response_flag说明。 |
route_name | %ROUTE_NAME% | 命中的路由名称,与虚拟服务中定义的路由名称一致,若该值为空("-"),则说明没有命中任何路由。 |
start_time | %START_TIME% | 开始处理该请求的时间(精确到毫秒)。 |
trace_id | %TRACE_ID% | 链路追踪的traceid |
upstream_cluster | %UPSTREAM_CLUSTER% | 上游目标服务和子集。 |
upstream_host | %UPSTREAM_HOST% | 上游目标主机,通常是Pod IP和端口。 |
upstream_local_address | %UPSTREAM_LOCAL_ADDRESS% | 与上游建立连接时使用的本地地址。 |
duration | $DURATION% |
|
request_duration | %REQUEST_DURATION% |
|
request_tx_duration | %REQUEST_TX_DURATION% |
|
response_duration | %RESPONSE_DURATION% |
|
response_tx_duration | %RESPONSE_TX_DURATION% |
|
upstream_service_time(sidecar) | %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% | 在Sidecar访问日志或网关日志中,该字段表示上游的处理时间及与上游进行网络通信消耗的时间。若该时间较长,请检查:
|
upstream_response_time(gateway) |
对于带有Body(Content-Length > 0)的HTTP请求,Envoy是边接收边发给上游(而非全部接受后发送)。如果下游的读取速度缓慢,将会增加上游的读取时间,以及上游发送给它的上游的时间(上游为边读边发送的方式)。
response_flag说明
访问日志的response_flag
字段的值可以对请求/连接的情况进行进一步说明,您可以参考下方表格中对response_flag
不同取值的说明,获得更多信息。
值 | 说明 |
值 | 说明 |
UH | 没有找到健康的上游主机,通常是由于目标服务没有可用端点造成。 |
UF | 连接到上游主机失败,通常是由于上游应用没有监听,或配置了错误的端口造成。 |
UO | 上游被熔断 |
NR | 没有找到针对对应请求的路由规则 |
NC | 无法找到目标服务,这通常意味着配置的路由规则中主机名或子集名称没有正确配置。 |
URX | 请求被限流 |
DC | 下游断开了连接 |
UR | 上游重置了连接 |
UAEX | 请求被外部授权服务拒绝,这意味着ASM网格代理遵从外部授权服务的返回而拒绝了该请求。 |
DPE | 处理下游请求时协议错误,这表明下游应用发送的请求使用了非预期的协议,请检查您集群中服务的端口名称(name)是否以正确的协议作为前缀,例如:http-80,http,grpc等。 |
UPE | 向上游发起请求时协议错误,这表明ASM网格代理尝试向上游转发的请求使用了非预期的协议,请检查您集群中服务的端口名称(name)是否以正确的协议作为前缀,例如:http-80,http,grpc等。 |
相关操作
您还可以使用日志服务采集数据平面的AccessLog。具体操作,请参见生成和采集ASM网关访问日志。
- 本页导读 (1)
- 前提条件
- 步骤一:启用访问日志
- 步骤二:自定义数据面访问日志内容
- 步骤三:查看访问日志
- 访问日志字段说明
- response_flag说明
- 相关操作