基于业务的需求,需要对ASM网关的日志格式进行定制,使ASM日志包含特定的Header。本文介绍如何使用EnvoyFilter自定义ASM网关日志格式。

创建EnvoyFilter

本文将请求报文的header user_id添加到ASM网关日志为例。

使用以下内容,创建EnvoyFilter,具体操作,请参见管理Envoy过滤器(EnvoyFilter)
说明 如果您使用的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配置是否生效

  1. 通过kubectl连接Kubernetes集群
  2. 执行以下命令,查看日志中增加的user_id是否生效。
    kubectl  exec $gateway_pod -n istio-system -- curl localhost:15000/config_dump |grep -5 user_id
    user

    可以看到user_id已经添加到accessLogFormat中。

  3. 执行以下命令,向网关发送请求。本文以user_id: 8888为例。
    curl -H 'user_id: 8888'  <Gateway IP> /some_path
  4. 执行以下命令,查看Gateway日志。
    kubectl -n istio-system  logs -f <Gateway Pod名称>  --tail=10
    日志

    可以看到,Gateway日志包含user_id信息。

版本说明

如果您使用的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