部署在数据平面(即加入网格的Kubernetes集群)的Envoy Proxy可以输出所有访问日志。ASM支持自定义Envoy Proxy输出的访问日志内容。本文介绍如何自定义Envoy Proxy输出的访问日志内容。
前提条件
步骤一:启用访问日志
ASM实例版本为1.17.2.35以下
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在基本信息页面右上角,单击功能设置。
在功能设置更新面板,选中开启访问日志并将其打印到容器标准输出,然后单击确定。
istio-proxy容器默认输出包含以下字段的日志。如果关闭访问日志,istio-proxy容器将不会产生JSON格式的访问日志。
ASM实例版本为1.17.2.35及以上
登录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实例版本为1.17.2.35以下
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在基本信息页面的配置信息区域,单击开启访问日志并将其打印到容器标准输出右侧的自定义访问日志格式。
在自定义访问日志格式对话框下方,新增自定义访问日志格式,设置变量名称为my_custom_key,变量值为%REQ(end-user)%,然后单击确认。
本文以获取Bookinfo示例中HTTP请求的Header字段end-user为例。如下图所示,自定义访问日志格式时,您可以选择ASM提供的可选字段,也可以新增自定义字段。选中目标字段后,将按照自定义的访问日志格式输出访问日志。
ASM实例版本为1.17.2.35及以上
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在可观测配置页面,按需单击全局、命名空间或自定义页签。
若您选择命名空间页签,请单击创建,按需选择命名空间。
若您选择自定义页签,请单击创建,按需选择命名空间,输入名称和匹配标签。
在日志设置区域,按需选中字段、修改目标字段信息或在最下方日志指标右侧单击图标,新增日志字段,然后单击提交。
只有打开启用日志输出开关,才能自定义日志格式。在日志格式区域,默认选中的日志字段为默认必选字段,不支持修改。日志字段支持从请求Header、响应Header、Envoy内置值中取值。
下文以打印请求中的accept-coding 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)”。
变量名称 | 变量值 | 说明 |
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是边接收边发给上游(而非全部接受后发送)。如果下游的读取速度缓慢,将会增加上游的读取时间,以及上游发送给它的上游的时间(上游为边读边发送的方式)。
相关操作
您还可以使用日志服务采集数据平面的AccessLog。具体操作,请参见生成和采集ASM网关访问日志。