Envoy访问日志%REQ(:AUTHORITY)%字段如何去端口,有无无端口替代字段
是否可以从%REQ(:AUTHORITY)%的取值中去除端口部分?
可以,目前有两种成熟的实现方案:
- 高版本Envoy(v1.22+)直接使用内置的访问日志格式化符即可,无需额外开发
- 低版本Envoy可以通过自定义过滤器预处理请求头,再在访问日志中引用处理后的字段
是否存在自带:AUTHORITY信息且不带端口的可用字段?
存在,Envoy官方提供了%HOST_NO_PORT%访问日志操作符,该字段的取值逻辑就是从请求的:AUTHORITY伪头(HTTP/2)或Host头(HTTP/1.1)中自动去除端口后缀,返回纯域名/IP部分:
- 如果原始请求头中本身不携带端口,该字段直接返回原值,不会有截断异常
- 如果需要自定义逻辑处理(比如特殊端口场景下的保留规则),也可以通过CEL表达式自定义取值,示例配置片段如下:
access_log: name: envoy.access_loggers.stdout typed_config: "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog log_format: text_format: "%START_TIME% %HOST_NO_PORT% %RESPONSE_CODE% %BYTES_SENT% \n"
如果你的Envoy版本低于v1.22不支持该操作符,可以通过Lua过滤器提前处理:
- 在HTTP过滤器链中新增Lua配置,提取不带端口的host写入自定义请求头:
function envoy_on_request(request_handle) local authority = request_handle:headers():get(":authority") local host_no_port = string.match(authority, "([^:]+)") request_handle:headers():add("x-host-no-port", host_no_port) end
- 访问日志中直接引用该自定义头即可:
%REQ(X-HOST-NO-PORT)%
内容的提问来源于stack exchange,提问作者JME
相关产品推荐
相关产品推荐

