如何在Envoy 1.18中分离上游与下游访问日志?
Envoy 1.18 分离入站/出站访问日志实现方案
Envoy 1.18 没有提供直接的filter_direction字段,但可以通过两种方式实现按流量方向分离访问日志:
方式一:使用表达式过滤器判断流量方向
通过ExpressionFilter结合request.direction属性,精准过滤入站或出站流量日志:
入站日志配置(仅记录客户端到Envoy的流量)
access_log: - name: envoy.file_access_log typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /var/log/envoy/access-inbound.log filter: name: envoy.filters.access_log.expression typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.expression.v3.ExpressionFilter # 仅匹配入站流量 expression: "request.direction == 'INBOUND'"
出站日志配置(仅记录Envoy到上游集群的流量)
access_log: - name: envoy.file_access_log typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /var/log/envoy/access-outbound.log filter: name: envoy.filters.access_log.expression typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.expression.v3.ExpressionFilter # 仅匹配出站流量 expression: "request.direction == 'OUTBOUND'"
如果已有自定义过滤器,可通过逻辑运算符结合,比如:
expression: "request.direction == 'INBOUND' and (request.path starts_with '/api')"
方式二:按Envoy组件分离配置(更严谨)
入站流量由listeners组件处理,出站流量由clusters组件处理,分别在对应块中配置访问日志,无需额外过滤即可天然分离:
Listener级别(入站流量日志)
listeners: - name: ingress_listener address: socket_address: { address: 0.0.0.0, port_value: 8080 } filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: upstream_service } http_filters: - name: envoy.filters.http.router typed_config: {} # 入站流量日志配置在listener的http_connection_manager下 access_log: - name: envoy.file_access_log typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /var/log/envoy/access-inbound.log
Cluster级别(出站流量日志)
clusters: - name: upstream_service connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: upstream_service endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: upstream, port_value: 80 } # 出站流量日志配置在cluster下 access_log: - name: envoy.file_access_log typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog path: /var/log/envoy/access-outbound.log
两种方式对比
- 表达式过滤器方式:适合需要在全局或单一配置块中区分流量方向的场景,灵活性高。
- 组件分离配置方式:逻辑更清晰,日志归属明确,避免过滤规则出错,推荐用于生产环境。
内容的提问来源于stack exchange,提问作者Pranav Choudhary
相关产品推荐
相关产品推荐

