基于业务的需求,需要对ASM网关的日志格式进行定制,使ASM日志包含特定的Header。本文介绍如何使用EnvoyFilter自定义ASM网关日志格式。
创建EnvoyFilter
本文将请求报文的header user_id
添加到ASM网关日志为例。
使用以下内容,创建EnvoyFilter,具体操作,请参见管理Envoy过滤器。
说明 如果您使用的ASM实例版本高于1.8,建议在EnvoyFilter中typed_config参数中使用envoy v3的API接口。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: gateway-accesslog-userdefine
namespace: istio-system
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: ANY
listener:
filterChain:
filter:
name: envoy.http_connection_manager
patch:
operation: MERGE
value:
typed_config:
'@type': >-
type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
access_log:
- name: envoy.access_loggers.file
typed_config:
'@type': >-
type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
log_format:
json_format:
authority: '%REQ(:AUTHORITY)%'
bytes_received: '%BYTES_RECEIVED%'
bytes_sent: '%BYTES_SENT%'
downstream_local_address: '%DOWNSTREAM_LOCAL_ADDRESS%'
downstream_remote_address: '%DOWNSTREAM_REMOTE_ADDRESS%'
duration: '%DURATION%'
method: '%REQ(:METHOD)%'
path: '%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%'
protocol: '%PROTOCOL%'
request_id: '%REQ(X-REQUEST-ID)%'
requested_server_name: '%REQUESTED_SERVER_NAME%'
response_code: '%RESPONSE_CODE%'
response_flags: '%RESPONSE_FLAGS%'
route_name: '%ROUTE_NAME%'
start_time: '%START_TIME%'
upstream_cluster: '%UPSTREAM_CLUSTER%'
upstream_host: '%UPSTREAM_HOST%'
upstream_local_address: '%UPSTREAM_LOCAL_ADDRESS%'
upstream_service_time: '%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%'
upstream_transport_failure_reason: '%UPSTREAM_TRANSPORT_FAILURE_REASON%'
user_agent: '%REQ(USER-AGENT)%'
user_id: '%REQ(USER_ID)%'
x_forwarded_for: '%REQ(X-FORWARDED-FOR)%'
path: /dev/stdout
workloadSelector:
labels:
app: istio-ingressgateway
access_log format部分可以根据自身业务需求自定义修改。其中:
说明 log_format若不指定,将使用默认的Envoy accessLog format。
- namespace:指定EnvoyFilter生效的命名空间。
- workloadSelector:指定EnvoyFilter生效的网关实例。
app: istio-ingressgateway
为Gateway名称,需要根据实际情况进行修改,命名规则是app: istio-{Gateway名称}。
如果您想在日志中添加其他Header,您可以按照以下格式添加到EnvoyFilter中。
my_custom_header:'%REQ(MY_CUSTOM_HEADER)%'
对应ASM网关日志会包含以下内容。
{"protocol": "HTTP/1.1", "duration": "123", "my_custom_header": "value_of_MY_CUSTOM_HEADER"}
验证EnvoyFilter配置是否生效
版本说明
如果您使用的ASM实例版本低于1.8,建议在EnvoyFilter中typed_config参数中使用envoy v2的API接口。以下为EnvoyFilter示例。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: enable-accesslog
namespace: gateway-accesslog-userdefine
spec:
configPatches:
- applyTo: NETWORK_FILTER
match:
context: ANY
listener:
filterChain:
filter:
name: envoy.http_connection_manager
patch:
operation: MERGE
value:
typed_config:
"@type": "type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager"
access_log:
- name: envoy.file_access_log
config:
path: /dev/stdout
log_format:
....
workloadSelector:
labels:
app: istio-ingressgateway