访问日志记录

配置

访问日志作为 HTTP 连接管理器配置TCP 代理UDP 代理Thrift 代理 的一部分进行配置。

格式规则

访问日志格式包含用于提取相关数据并将其插入的命令运算符。它们支持两种格式:“格式字符串”“格式字典”。在这两种情况下,命令运算符都用于提取相关数据,然后将其插入到指定的日志格式中。一次只能指定一种访问日志格式。

格式字符串

格式字符串是普通字符串,使用 format 键指定。它们可以包含命令运算符或解释为普通字符串的其他字符。访问日志格式化程序不会对换行符做任何假设,因此必须在格式字符串中指定换行符。有关示例,请参见 默认格式

默认格式字符串

如果未指定自定义格式字符串,Envoy 将使用以下默认格式

[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n

默认 Envoy 访问日志格式的示例

[2016-04-15T20:17:00.310Z] "POST /api/v1/locations HTTP/2" 204 - 154 0 226 100 "10.0.35.28"
"nsq2http" "cc21d9b0-cf5c-432b-8c7e-98aeb7988cd2" "locations" "tcp://10.0.2.1:80"

格式字典

格式字典是指定结构化访问日志输出格式的字典,使用 json_formattyped_json_format 键指定。这允许日志以结构化格式输出,例如 JSON。与格式字符串类似,命令运算符将被评估,并将它们的值插入到格式字典中以构建日志输出。

例如,使用以下配置中作为 json_format 提供的格式

{
  "config": {
    "json_format": {
        "protocol": "%PROTOCOL%",
        "duration": "%DURATION%",
        "my_custom_header": "%REQ(MY_CUSTOM_HEADER)%"
    }
  }
}

以下 JSON 对象将写入日志文件

{"protocol": "HTTP/1.1", "duration": "123", "my_custom_header": "value_of_MY_CUSTOM_HEADER"}

这允许你为每个命令运算符指定一个自定义键。

The typed_json_format differs from json_format in that values are rendered as JSON numbers, booleans, and nested objects or lists where applicable. In the example, the request duration would be rendered as the number 123.

格式字典具有以下限制

  • 字典必须将字符串映射到字符串(具体来说,是字符串映射到命令运算符)。支持嵌套。

  • 使用 typed_json_format 时,命令运算符只有在命令运算符是字典值中唯一出现的字符串时才会生成类型化输出。例如,"%DURATION%" 将记录一个数值持续时间值,但 "%DURATION%.0" 将记录一个字符串值。

注意

使用 typed_json_format 时,超过 \(2^{53}\) 的整数值将以降低的精度表示,因为它们必须转换为浮点数。

命令运算符

命令运算符用于提取将插入访问日志的值。不同类型的访问日志(如 HTTP 和 TCP)使用相同的运算符。某些字段可能具有略微不同的含义,具体取决于它是哪种类型的日志。差异将在注释中说明。

请注意,如果某个值未设置/为空,则日志将包含一个 - 字符,或者对于 JSON 日志,将包含字符串 "-"。对于类型化的 JSON 日志,未设置的值表示为 null 值,空字符串表示为 ""omit_empty_values 选项可用于完全省略空值。

除非另有说明,否则命令运算符会为类型化的 JSON 日志生成字符串输出。

支持以下命令运算符

%START_TIME%
HTTP/THRIFT

请求开始时间,包括毫秒。

TCP

下游连接开始时间,包括毫秒。

UDP

UDP 代理会话开始时间,包括毫秒。

START_TIME 可以使用 格式字符串 进行自定义。此外,START_TIME 还接受以下说明符

说明符

解释

%s

自纪元以来的秒数

%f, %[1-9]f

小数秒位数,默认值为 9 位数(纳秒)

  • %3f 毫秒(3 位数)

  • %6f 微秒(6 位数)

  • %9f 纳秒(9 位数)

START_TIME 格式化的示例如下

%START_TIME(%Y/%m/%dT%H:%M:%S%z)%

%START_TIME(%s)%

# To include millisecond fraction of the second (.000 ... .999). E.g. 1527590590.528.
%START_TIME(%s.%3f)%

%START_TIME(%s.%6f)%

%START_TIME(%s.%9f)%

在类型化的 JSON 日志中,START_TIME 始终表示为字符串。

%START_TIME_LOCAL%

START_TIME 相同,但使用本地时区。

%EMIT_TIME%

日志条目发出时间,包括毫秒。

EMIT_TIME 可以使用 格式字符串 进行自定义。有关其他格式说明符和示例,请参见 START_TIME

%EMIT_TIME_LOCAL%

EMIT_TIME 相同,但使用本地时区。

%REQUEST_HEADERS_BYTES%
HTTP

请求报头的未压缩字节数。

TCP/UDP

未实现(0)。

%BYTES_RECEIVED%
HTTP/THRIFT

接收到的主体字节数。

TCP

在连接上接收到的下游字节数。

UDP

从 UDP 会话中的下游接收到的字节数。

在类型化的 JSON 日志中呈现数值。

%BYTES_RETRANSMITTED%
HTTP/3 (QUIC)

重新传输的主体字节数。

HTTP/1 和 HTTP/2

未实现(0)。

TCP/UDP

未实现(0)。

在类型化的 JSON 日志中呈现数值。

%PACKETS_RETRANSMITTED%
HTTP/3 (QUIC)

重新传输的数据包数量。

HTTP/1 和 HTTP/2

未实现(0)。

TCP/UDP

未实现(0)。

在类型化的 JSON 日志中呈现数值。

%PROTOCOL%
HTTP

协议。当前为 HTTP/1.1 HTTP/2HTTP/3

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中,如果协议不可用(例如在 TCP 日志中),PROTOCOL 将呈现字符串 "-"

%UPSTREAM_PROTOCOL%
HTTP

上游协议。当前为 HTTP/1.1 HTTP/2HTTP/3

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中,如果协议不可用(例如在 TCP 日志中),UPSTREAM_PROTOCOL 将呈现字符串 "-"

%RESPONSE_CODE%
HTTP

HTTP 响应代码。请注意,响应代码“0”表示服务器从未发送响应的开始。这通常表示(下游)客户端已断开连接。

请注意,在 100-continue 响应的情况下,仅记录最终报头的响应代码。如果 100-continue 后跟 200,则记录的响应将为 200。如果 100-continue 导致断开连接,则记录 100。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%RESPONSE_CODE_DETAILS%
HTTP

HTTP 响应代码详细信息提供了有关响应代码的附加信息,例如谁设置了它(上游或 envoy)以及原因。

TCP/UDP

未实现 (“-“)

%CONNECTION_TERMINATION_DETAILS%
HTTP 和 TCP

连接终止详细信息可能提供有关 Envoy 因 L4 原因终止连接的原因的附加信息。

%RESPONSE_HEADERS_BYTES%
HTTP

响应报头的未压缩字节数。

TCP/UDP

未实现(0)。

%RESPONSE_TRAILERS_BYTES%
HTTP

响应拖尾报头的未压缩字节数。

TCP/UDP

未实现(0)。

%BYTES_SENT%
HTTP/THRIFT

发送的主体字节数。对于 WebSocket 连接,它还将包含响应报头字节数。

TCP

在连接上发送的下游字节数。

UDP

在 UDP 会话中发送到下游的字节数。

%UPSTREAM_REQUEST_ATTEMPT_COUNT%
HTTP

请求在上游尝试的次数。请注意,尝试次数“0”表示请求从未在上游尝试过。

TCP

连接请求在上游尝试的次数。请注意,尝试次数“0”表示连接请求从未在上游尝试过。

UDP

未实现(0)。

在类型化的 JSON 日志中呈现数值。

%UPSTREAM_WIRE_BYTES_SENT%
HTTP

HTTP 流发送到上游的总字节数。

TCP

TCP 代理发送到上游的总字节数。

UDP

发送到上游流的总字节数,对于 UDP 隧道流量。不支持非隧道流量。

%UPSTREAM_WIRE_BYTES_RECEIVED%
HTTP

HTTP 流从上游接收到的总字节数。

TCP

TCP 代理从上游接收到的总字节数。

UDP

从上游流接收到的总字节数,对于 UDP 隧道流量。不支持非隧道流量。

%UPSTREAM_HEADER_BYTES_SENT%
HTTP

HTTP 流发送到上游的报头字节数。

TCP

未实现(0)。

UDP

发送到上游流的 HTTP 报头总字节数,对于 UDP 隧道流量。不支持非隧道流量。

%UPSTREAM_HEADER_BYTES_RECEIVED%
HTTP

HTTP 流从上游接收到的报头字节数。

TCP

未实现(0)。

UDP

从上游流接收到的 HTTP 报头总字节数,对于 UDP 隧道流量。不支持非隧道流量。

%DOWNSTREAM_WIRE_BYTES_SENT%
HTTP

HTTP 流发送到下游的总字节数。

TCP

TCP 代理发送到下游的总字节数。

UDP

未实现(0)。

%DOWNSTREAM_WIRE_BYTES_RECEIVED%
HTTP

HTTP 流从下游接收到的字节总数。Envoy 会通过将管道中的请求字节添加到当前正在处理的请求字节来统计接收到的 HTTP/1.1 管道式请求的大小。

TCP

TCP 代理从下游接收到的字节总数。

UDP

未实现(0)。

%DOWNSTREAM_HEADER_BYTES_SENT%
HTTP

HTTP 流发送到下游的标头字节数。

TCP/UDP

未实现(0)。

%DOWNSTREAM_HEADER_BYTES_RECEIVED%
HTTP

HTTP 流从下游接收到的标头字节数。

TCP/UDP

未实现(0)。

在类型化的 JSON 日志中呈现数值。

%DURATION%
HTTP/THRIFT

从请求开始时间到最后一个字节发送出去的请求总持续时间(毫秒)。

TCP

下游连接的总持续时间(毫秒)。

UDP

未实现(0)。

在类型化的 JSON 日志中呈现数值。

%COMMON_DURATION(START:END:PRECISION)%
HTTP

从 START 时间点到 END 时间点的总持续时间,以特定 PRECISION 为单位。START 和 END 时间点由以下值指定(注意:所有值在此处区分大小写)

  • DS_RX_BEG:下游请求接收开始的时间点。

  • DS_RX_END:下游请求接收结束的时间点。

  • US_TX_BEG:上游请求发送开始的时间点。

  • US_TX_END:上游请求发送结束的时间点。

  • US_RX_BEG:上游响应接收开始的时间点。

  • US_RX_END:上游响应接收结束的时间点。

  • DS_TX_BEG:下游响应发送开始的时间点。

  • DS_TX_END:下游响应发送结束的时间点。

  • 动态值:其他值将被视为由命名键设置的自定义时间点。

PRECISION 由以下值指定(注意:所有值在此处区分大小写)

  • ms:毫秒精度。

  • us:微秒精度。

  • ns:纳秒精度。

注意:为 H/2 和 H/3 协议启用独立的半关闭行为会导致 *_TX_END 值低于 *_RX_END 值,在这种情况下,上游对等方在对等方关闭其流之前已关闭其流。在这种情况下,COMMON_DURATION 值将变为负数。

TCP/UDP

未实现 (“-“)。

%REQUEST_DURATION%
HTTP

从请求开始时间到从下游接收到的最后一个请求字节的请求总持续时间(毫秒)。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%REQUEST_TX_DURATION%
HTTP

从请求开始时间到发送到上游的最后一个字节的请求总持续时间(毫秒)。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%RESPONSE_DURATION%
HTTP

从请求开始时间到从上游主机读取的第一个字节的请求总持续时间(毫秒)。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%ROUNDTRIP_DURATION%
HTTP/3 (QUIC)

从请求开始时间到从下游接收到的最后一个确认的请求总持续时间(毫秒)。

HTTP/1 和 HTTP/2

未实现 (“-“)。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%RESPONSE_TX_DURATION%
HTTP

从请求开始时间到从上游主机读取的第一个字节到发送到下游的最后一个字节的请求总持续时间(毫秒)。

TCP/UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%DOWNSTREAM_HANDSHAKE_DURATION%
HTTP

未实现 (“-“)。

TCP

从连接开始到 TLS 握手完成的总持续时间(毫秒)。

UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%UPSTREAM_CONNECTION_POOL_READY_DURATION%
HTTP/TCP

从创建上游请求到连接池准备好的总持续时间(毫秒)。

UDP

未实现 (“-“)。

在类型化的 JSON 日志中呈现数值。

%RESPONSE_FLAGS% / %RESPONSE_FLAGS_LONG%

关于响应或连接的附加详细信息(如果有)。对于 TCP 连接,描述中提到的响应代码不适用。%RESPONSE_FLAGS% 将输出一个短字符串。%RESPONSE_FLAGS_LONG% 将输出一个 Pascal 大小写字符串。可能的值是

HTTP 和 TCP

长名称

短名称

描述

NoHealthyUpstream

UH

除了 503 响应代码之外,上游集群中没有健康的上游主机。

UpstreamConnectionFailure

UF

除了 503 响应代码之外,上游连接失败。

UpstreamOverflow

UO

除了 503 响应代码之外,上游溢出 (断路器)。

NoRouteFound

NR

除了 404 响应代码之外,没有为给定请求配置 路由,或者没有为下游连接匹配的过滤器链。

UpstreamRetryLimitExceeded

URX

请求被拒绝,因为 上游重试限制(HTTP)最大连接尝试次数(TCP) 已达到。

NoClusterFound

NC

未找到上游集群。

DurationTimeout

DT

当请求或连接超过 max_connection_durationmax_downstream_connection_duration 时。

HTTP 仅

长名称

短名称

描述

DownstreamConnectionTermination

DC

下游连接终止。

FailedLocalHealthCheck

LH

本地服务失败 健康检查请求,除了 503 响应代码。

UpstreamRequestTimeout

UT

除了 504 响应代码之外,上游请求超时。

LocalReset

LR

除了 503 响应代码之外,连接本地重置。

UpstreamRemoteReset

UR

除了 503 响应代码之外,上游远程重置。

UpstreamConnectionTermination

UC

除了 503 响应代码之外,上游连接终止。

DelayInjected

DI

请求处理延迟了一段时间,该时间段通过 错误注入 指定。

FaultInjected

FI

请求通过 错误注入 指定的响应代码中止。

RateLimited

RL

请求被 HTTP 速率限制过滤器 在本地速率限制,除了 429 响应代码。

UnauthorizedExternalService

UAEX

请求被外部授权服务拒绝。

RateLimitServiceError

RLSE

请求被拒绝,因为速率限制服务出现错误。

InvalidEnvoyRequestHeaders

IH

请求被拒绝,因为它为 严格检查的标头 设置了无效的值,除了 400 响应代码。

StreamIdleTimeout

SI

流空闲超时,除了 408 或 504 响应代码。

DownstreamProtocolError

DPE

下游请求存在 HTTP 协议错误。

UpstreamProtocolError

UPE

上游响应存在 HTTP 协议错误。

UpstreamMaxStreamDurationReached

UMSDR

上游请求达到最大流持续时间。

ResponseFromCacheFilter

RFCF

响应来自 Envoy 缓存过滤器。

NoFilterConfigFound

NFCF

请求终止,因为过滤器配置未在允许的预热截止时间内收到。

OverloadManagerTerminated

OM

过载管理器终止了请求。

DnsResolutionFailed

DF

请求由于 DNS 解析失败而终止。

DropOverload

DO

请求除了 503 响应代码之外,还由于 drop_overloads 而终止。

DownstreamRemoteReset

DR

响应详细信息为 http2.remote_resethttp2.remote_refuse

UDP

未实现 (“-“)。

%ROUTE_NAME%
HTTP/TCP

路由的名称。

UDP

未实现 (“-“)。

%VIRTUAL_CLUSTER_NAME%
HTTP*/gRPC

匹配的虚拟集群(如果有)的名称。

TCP/UDP

未实现 (“-“)

%UPSTREAM_HOST%

上游主机的主要地址(例如,对于 TCP 连接,ip:port)。

%UPSTREAM_HOST_NAME%

上游主机名(例如,DNS 名称)。如果不可用 DNS 名称,则使用上游主机的主要地址(例如,对于 TCP 连接,ip:port)。

%UPSTREAM_CLUSTER%

上游主机所属的上游集群。如果提供 alt_stat_name,则使用该值。

%UPSTREAM_CLUSTER_RAW%

上游主机所属的上游集群。alt_stat_name 不会修改此值。

%UPSTREAM_LOCAL_ADDRESS%

上游连接的本地地址。如果地址是 IP 地址,它包含地址和端口。

%UPSTREAM_LOCAL_ADDRESS_WITHOUT_PORT%

上游连接的本地地址,不包含任何端口组件。IP 地址是唯一具有端口组件的地址类型。

%UPSTREAM_LOCAL_PORT%

上游连接的本地端口。IP 地址是唯一具有端口组件的地址类型。

%UPSTREAM_REMOTE_ADDRESS%

上游连接的远程地址。如果地址是 IP 地址,它包含地址和端口。如果上游主机只有一个地址并且连接成功建立,则与 UPSTREAM_HOST 值相同。

%UPSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%

上游连接的远程地址,不包含任何端口组件。IP 地址是唯一具有端口组件的地址类型。

%UPSTREAM_REMOTE_PORT%

上游连接的远程端口。IP 地址是唯一具有端口组件的地址类型。

%UPSTREAM_TRANSPORT_FAILURE_REASON%
HTTP

如果上游连接由于传输套接字(例如 TLS 握手)而失败,则提供来自传输套接字的失败原因。此字段的格式取决于配置的上游传输套接字。常见的 TLS 故障在 TLS 故障排除 中。

TCP/UDP

未实现 (“-“)

%DOWNSTREAM_TRANSPORT_FAILURE_REASON%
HTTP/TCP

如果下游连接由于传输套接字(例如 TLS 握手)而失败,则提供来自传输套接字的失败原因。此字段的格式取决于配置的下游传输套接字。常见的 TLS 故障在 TLS 故障排除 中。注意:它只在监听器访问配置中起作用,HTTP 或 TCP 访问日志将观察到空值。

UDP

未实现 (“-“)

%DOWNSTREAM_REMOTE_ADDRESS%

下游连接的远程地址。如果地址是 IP 地址,它包含地址和端口。

注意

如果地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这可能不是对等方的物理远程地址。

%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%

下游连接的远程地址,不包含任何端口组件。只有 IP 地址包含端口组件。

注意

如果地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这可能不是对等方的物理远程地址。

%DOWNSTREAM_REMOTE_PORT%

下游连接的远程端口。只有 IP 地址包含端口组件。

注意

如果地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这可能不是对等方的物理远程地址。

%DOWNSTREAM_DIRECT_REMOTE_ADDRESS%

下游连接的直接远程地址。如果地址是 IP 地址,它将包含地址和端口。

注意

即使下游远程地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这也始终是对等方的物理远程地址。

%DOWNSTREAM_DIRECT_REMOTE_ADDRESS_WITHOUT_PORT%

下游连接的直接远程地址,不包含任何端口组件。只有 IP 地址包含端口组件。

注意

即使下游远程地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这也始终是对等方的物理远程地址。

%DOWNSTREAM_DIRECT_REMOTE_PORT%

下游连接的直接远程端口。只有 IP 地址包含端口组件。

注意

即使下游远程地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这也始终是对等方的物理远程地址。

%DOWNSTREAM_LOCAL_ADDRESS%

下游连接的本地地址。如果地址是 IP 地址,它将包含地址和端口。

如果原始连接被 iptables REDIRECT 重定向,则表示使用 SO_ORIGINAL_DST 套接字选项由 原始目标过滤器 恢复的原始目标地址。如果原始连接被 iptables TPROXY 重定向,并且监听器的透明选项设置为 true,则表示原始目标地址和端口。

注意

如果地址是通过 Proxy Protocol 过滤器x-forwarded-for 推断的,这可能不是对等方的物理远程地址。

%DOWNSTREAM_LOCAL_ADDRESS_WITHOUT_PORT%

下游连接的本地地址,不包含任何端口组件。只有 IP 地址包含端口组件。

%DOWNSTREAM_LOCAL_PORT%

下游连接的本地端口。只有 IP 地址包含端口组件。

%CONNECTION_ID%

下游连接的标识符。它可以用来跨多个日志接收器交叉引用 TCP 访问日志,或者用来交叉引用同一个连接的基于计时器的报告。该标识符在执行过程中很可能唯一,但可能会跨多个实例或重启重复出现。

%UPSTREAM_CONNECTION_ID%

上游连接的标识符。它可以用来跨多个日志接收器交叉引用 TCP 访问日志,或者用来交叉引用同一个连接的基于计时器的报告。该标识符在执行过程中很可能唯一,但可能会跨多个实例或重启重复出现。

%STREAM_ID%

流(HTTP 请求、长连接 HTTP2 流、TCP 连接等)的标识符。它可以用来跨多个日志接收器交叉引用 TCP 访问日志,或者用来交叉引用同一个连接的基于计时器的报告。与 %CONNECTION_ID% 不同,该标识符在多个实例或重启之间应该是唯一的。它的值应该与 HTTP 请求的 %REQ(X-REQUEST-ID)% 相同。在大多数情况下,它应该用来替换 %CONNECTION_ID% 和 %REQ(X-REQUEST-ID)%。

%GRPC_STATUS(X)%

根据可选参数 X 格式化的 gRPC 状态码,它可以是 CAMEL_STRINGSNAKE_STRINGNUMBER。例如,如果 grpc 状态是 INVALID_ARGUMENT(用数字 3 表示),则格式化程序将为 CAMEL_STRING 返回 InvalidArgument,为 SNAKE_STRING 返回 INVALID_ARGUMENT,为 NUMBER 返回 3。如果没有提供 X,将使用 CAMEL_STRING

%GRPC_STATUS_NUMBER%

gRPC 状态码。

%REQ(X?Y):Z%
HTTP

HTTP 请求头,其中 X 是主要的 HTTP 头,Y 是备选头,Z 是可选参数,表示字符串截断,最多 Z 个字符长。该值首先从名为 X 的 HTTP 请求头中获取,如果未设置,则使用请求头 Y。如果头都不存在,日志中将包含 ‘-’ 符号。

TCP/UDP

未实现 (“-“)。

%RESP(X?Y):Z%
HTTP

%REQ(X?Y):Z% 相同,但从 HTTP 响应头中获取。

TCP/UDP

未实现 (“-“)。

%TRAILER(X?Y):Z%
HTTP

%REQ(X?Y):Z% 相同,但从 HTTP 响应尾部获取。

TCP/UDP

未实现 (“-“)。

%DYNAMIC_METADATA(NAMESPACE:KEY*):Z%
HTTP

动态元数据 信息,其中 NAMESPACE 是设置元数据时使用的过滤器命名空间,KEY 是命名空间中可选的查找键,可以选择指定用 ‘:’ 分隔的嵌套键,Z 是可选参数,表示字符串截断,最多 Z 个字符长。动态元数据可以通过使用 StreamInfo API:setDynamicMetadata 的过滤器来设置。数据将以 JSON 字符串的形式记录。例如,对于以下动态元数据

com.test.my_filter: {"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %DYNAMIC_METADATA(com.test.my_filter)% 将记录:{"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %DYNAMIC_METADATA(com.test.my_filter:test_key)% 将记录:foo

  • %DYNAMIC_METADATA(com.test.my_filter:test_object)% 将记录:{"inner_key": "bar"}

  • %DYNAMIC_METADATA(com.test.my_filter:test_object:inner_key)% 将记录:bar

  • %DYNAMIC_METADATA(com.unknown_filter)% 将记录:-

  • %DYNAMIC_METADATA(com.test.my_filter:unknown_key)% 将记录:-

  • %DYNAMIC_METADATA(com.test.my_filter):25% 将记录(截断为 25 个字符):{"test_key": "foo", "test

TCP

未实现 (“-“)。

UDP

对于 UDP 代理,当 NAMESPACE 设置为 “udp.proxy.session” 时,可选的 KEY 如下所示

  • cluster_name: 集群名称。

  • bytes_sent: 会话中发送到下游的总字节数。已弃用,请使用 %BYTES_SENT% 代替。

  • bytes_received: 会话中从下游接收到的总字节数。已弃用,请使用 %BYTES_RECEIVED% 代替。

  • errors_sent: 会话中向下游发送数据报时发生的错误次数。

  • datagrams_sent: 会话中发送到下游的数据报数量。

  • datagrams_received: 会话中从下游接收到的数据报数量。

推荐的 UDP 代理会话访问日志格式

[%START_TIME%] %DYNAMIC_METADATA(udp.proxy.session:cluster_name)%
%DYNAMIC_METADATA(udp.proxy.session:bytes_sent)%
%DYNAMIC_METADATA(udp.proxy.session:bytes_received)%
%DYNAMIC_METADATA(udp.proxy.session:errors_sent)%
%DYNAMIC_METADATA(udp.proxy.session:datagrams_sent)%
%DYNAMIC_METADATA(udp.proxy.session:datagrams_received)%\n

当 NAMESPACE 设置为 “udp.proxy.proxy” 时,可选的 KEY 如下所示

  • bytes_sent: UDP 代理中发送到下游的总字节数。已弃用,请使用 %BYTES_SENT% 代替。

  • bytes_received: UDP 代理中从下游接收到的总字节数。已弃用,请使用 %BYTES_RECEIVED% 代替。

  • errors_sent: UDP 代理中向下游发送数据报时发生的错误次数。

  • errors_received: UDP 代理中从下游接收数据报时发生的错误次数。

  • datagrams_sent: UDP 代理中发送到下游的数据报数量。

  • datagrams_received: UDP 代理中从下游接收到的数据报数量。

  • no_route: UDP 代理中未找到上游集群的次数。

  • session_total: UDP 代理中的会话总数。

  • idle_timeout: UDP 代理中会话空闲超时发生的次数。

推荐的 UDP 代理代理访问日志格式

[%START_TIME%]
%DYNAMIC_METADATA(udp.proxy.proxy:bytes_sent)%
%DYNAMIC_METADATA(udp.proxy.proxy:bytes_received)%
%DYNAMIC_METADATA(udp.proxy.proxy:errors_sent)%
%DYNAMIC_METADATA(udp.proxy.proxy:errors_received)%
%DYNAMIC_METADATA(udp.proxy.proxy:datagrams_sent)%
%DYNAMIC_METADATA(udp.proxy.proxy:datagrams_received)%
%DYNAMIC_METADATA(udp.proxy.proxy:session_total)%\n
THRIFT

对于 Thrift 代理,NAMESPACE 应该始终设置为 “thrift.proxy”,可选的 KEY 如下所示

  • method: 方法名称。

  • cluster_name: 集群名称。

  • passthrough: 请求和响应的直通支持。

  • request:transport_type: 请求的传输类型。

  • request:protocol_type: 请求的协议类型。

  • request:message_type: 请求的消息类型。

  • response:transport_type: 响应的传输类型。

  • response:protocol_type: 响应的协议类型。

  • response:message_type: 响应的消息类型。

  • response:reply_type: 响应的回复类型。

推荐的 Thrift 代理访问日志格式

[%START_TIME%] %DYNAMIC_METADATA(thrift.proxy:method)%
%DYNAMIC_METADATA(thrift.proxy:cluster)%
%DYNAMIC_METADATA(thrift.proxy:request:transport_type)%
%DYNAMIC_METADATA(thrift.proxy:request:protocol_type)%
%DYNAMIC_METADATA(thrift.proxy:request:message_type)%
%DYNAMIC_METADATA(thrift.proxy:response:transport_type)%
%DYNAMIC_METADATA(thrift.proxy:response:protocol_type)%
%DYNAMIC_METADATA(thrift.proxy:response:message_type)%
%DYNAMIC_METADATA(thrift.proxy:response:reply_type)%
%BYTES_RECEIVED%
%BYTES_SENT%
%DURATION%
%UPSTREAM_HOST%\n

注意

对于类型化的 JSON 日志,当引用的键是简单值时,此运算符将渲染一个具有字符串、数字或布尔类型的值。如果引用的键是结构体或列表值,则将渲染 JSON 结构体或列表。结构体和列表可以嵌套。在任何情况下,都会忽略最大长度。

注意

DYNAMIC_METADATA 命令运算符将在将来被弃用,转而使用 METADATA 运算符。

%CLUSTER_METADATA(NAMESPACE:KEY*):Z%
HTTP

上游集群元数据 信息,其中 NAMESPACE 是设置元数据时使用的过滤器命名空间,KEY 是命名空间中可选的查找键,可以选择指定用 ‘:’ 分隔的嵌套键,Z 是可选参数,表示字符串截断,最多 Z 个字符长。数据将以 JSON 字符串的形式记录。例如,对于以下动态元数据

com.test.my_filter: {"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %CLUSTER_METADATA(com.test.my_filter)% 将记录:{"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %CLUSTER_METADATA(com.test.my_filter:test_key)% 将记录:foo

  • %CLUSTER_METADATA(com.test.my_filter:test_object)% 将记录:{"inner_key": "bar"}

  • %CLUSTER_METADATA(com.test.my_filter:test_object:inner_key)% 将记录:bar

  • %CLUSTER_METADATA(com.unknown_filter)% 将记录:-

  • %CLUSTER_METADATA(com.test.my_filter:unknown_key)% 将记录:-

  • %CLUSTER_METADATA(com.test.my_filter):25% 将记录(截取到 25 个字符):{"test_key": "foo", "test

TCP/UDP/THRIFT

未实现 (“-“)。

注意

对于类型化的 JSON 日志,当引用的键是简单值时,此运算符将渲染一个具有字符串、数字或布尔类型的值。如果引用的键是结构体或列表值,则将渲染 JSON 结构体或列表。结构体和列表可以嵌套。在任何情况下,都会忽略最大长度。

注意

CLUSTER_METADATA 命令操作符将在未来被弃用,取而代之的是 METADATA 操作符。

%UPSTREAM_METADATA(NAMESPACE:KEY*):Z%
HTTP/TCP

上游主机元数据 信息,其中 NAMESPACE 是设置元数据时使用的过滤器命名空间,KEY 是命名空间中的可选查找键,可以使用“:”分隔的嵌套键进行指定,Z 是可选参数,表示截取的字符串长度(最多 Z 个字符)。数据将以 JSON 字符串的形式记录。例如,对于以下上游主机元数据

com.test.my_filter: {"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %UPSTREAM_METADATA(com.test.my_filter)% 将记录:{"test_key": "foo", "test_object": {"inner_key": "bar"}}

  • %UPSTREAM_METADATA(com.test.my_filter:test_key)% 将记录:foo

  • %UPSTREAM_METADATA(com.test.my_filter:test_object)% 将记录:{"inner_key": "bar"}

  • %UPSTREAM_METADATA(com.test.my_filter:test_object:inner_key)% 将记录:bar

  • %UPSTREAM_METADATA(com.unknown_filter)% 将记录:-

  • %UPSTREAM_METADATA(com.test.my_filter:unknown_key)% 将记录:-

  • %UPSTREAM_METADATA(com.test.my_filter):25% 将记录(截取到 25 个字符):{"test_key": "foo", "test

UDP/THRIFT

未实现 (“-“)。

注意

对于类型化的 JSON 日志,当引用的键是简单值时,此运算符将渲染一个具有字符串、数字或布尔类型的值。如果引用的键是结构体或列表值,则将渲染 JSON 结构体或列表。结构体和列表可以嵌套。在任何情况下,都会忽略最大长度。

注意

UPSTREAM_METADATA 命令操作符将在未来被弃用,取而代之的是 METADATA 操作符。

%FILTER_STATE(KEY:F:FIELD?):Z%
HTTP

过滤器状态 信息,其中 KEY 是用于查找过滤器状态对象的必填项。如果可能,序列化后的 proto 将以 JSON 字符串形式记录。如果序列化后的 proto 对 Envoy 未知,它将以 protobuf 调试字符串形式记录。Z 是可选参数,表示截取的字符串长度(最多 Z 个字符)。F 是可选参数,用于指示 FilterState 使用哪种方法进行序列化。如果设置了“PLAIN”,过滤器状态对象将作为非结构化字符串进行序列化。如果设置了“TYPED”或未提供 F,则过滤器状态对象将作为 JSON 字符串进行序列化。如果将 F 设置为“FIELD”,则将序列化过滤器状态对象中名为 FIELD 的字段。FIELD 参数应仅与 F 设置为“FIELD”时一起使用。

TCP/UDP

与 HTTP 相同,过滤器状态来自连接而不是 L7 请求。

注意

对于类型化的 JSON 日志,当引用键为简单值时,此操作符会呈现单个具有字符串、数字或布尔类型的值。如果引用键为结构体或列表值,则会呈现 JSON 结构体或列表。结构体和列表可以嵌套。在任何情况下,都会忽略最大长度。

%UPSTREAM_FILTER_STATE(KEY:F:FIELD?):Z%
HTTP

从上游组件(如集群或传输套接字扩展)中提取过滤器状态。

过滤器状态 信息,其中 KEY 是用于查找过滤器状态对象的必填项。如果可能,序列化后的 proto 将以 JSON 字符串形式记录。如果序列化后的 proto 对 Envoy 未知,它将以 protobuf 调试字符串形式记录。Z 是可选参数,表示截取的字符串长度(最多 Z 个字符)。F 是可选参数,用于指示 FilterState 使用哪种方法进行序列化。如果设置了“PLAIN”,过滤器状态对象将作为非结构化字符串进行序列化。如果设置了“TYPED”或未提供 F,则过滤器状态对象将作为 JSON 字符串进行序列化。如果将 F 设置为“FIELD”,则将序列化过滤器状态对象中名为 FIELD 的字段。FIELD 参数应仅与 F 设置为“FIELD”时一起使用。

TCP/UDP

未实现。

注意

此命令操作符仅适用于 upstream_log

%REQUESTED_SERVER_NAME%
HTTP/TCP/THRIFT

在 SSL 连接套接字上为服务器名称指示 (SNI) 设置的字符串值

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_IP_SAN%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书的 SAN 中存在的 IP 地址。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_IP_SAN%
HTTP/TCP/THRIFT

从下游客户端接收到的用于建立 TLS 连接的对等证书的 SAN 中存在的 IP 地址。

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_DNS_SAN%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书的 SAN 中存在的 DNS 名称。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_DNS_SAN%
HTTP/TCP/THRIFT

从下游客户端接收到的用于建立 TLS 连接的对等证书的 SAN 中存在的 DNS 名称。

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_URI_SAN%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书的 SAN 中存在的 URI。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_URI_SAN%
HTTP/TCP/THRIFT

从下游客户端接收到的用于建立 TLS 连接的对等证书的 SAN 中存在的 URI。

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_EMAIL_SAN%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书的 SAN 中存在的电子邮件。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_EMAIL_SAN%
HTTP/TCP/THRIFT

从下游客户端接收到的用于建立 TLS 连接的对等证书的 SAN 中存在的电子邮件。

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_OTHERNAME_SAN%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书的 SAN 中存在的 OtherNames。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_OTHERNAME_SAN%
HTTP/TCP/THRIFT

从下游客户端接收到的用于建立 TLS 连接的对等证书的 SAN 中存在的 OtherNames。

UDP

未实现 (“-“)。

%DOWNSTREAM_LOCAL_SUBJECT%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的本地证书中存在的主题。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_SUBJECT%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的对等证书中存在的主题。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_ISSUER%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的对等证书中存在的颁发者。

UDP

未实现 (“-“)。

%DOWNSTREAM_TLS_SESSION_ID%
HTTP/TCP/THRIFT

已建立的下游 TLS 连接的会话 ID。

UDP

未实现(0)。

%DOWNSTREAM_TLS_CIPHER%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的密码集的 OpenSSL 名称。

UDP

未实现 (“-“)。

%DOWNSTREAM_TLS_VERSION%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的 TLS 版本(例如,TLSv1.2TLSv1.3)。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_FINGERPRINT_256%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书的十六进制编码 SHA256 指纹。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_FINGERPRINT_1%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书的十六进制编码 SHA1 指纹。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_SERIAL%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书的序列号。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_CHAIN_FINGERPRINTS_256%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的所有客户端证书的十六进制编码 SHA256 指纹(以逗号分隔)。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_CHAIN_FINGERPRINTS_1%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的所有客户端证书的十六进制编码 SHA1 指纹(以逗号分隔)。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_CHAIN_SERIALS%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的所有客户端证书的序列号(以逗号分隔)。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_CERT%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书(以 URL 编码的 PEM 格式)。

UDP

未实现 (“-“)。

%DOWNSTREAM_PEER_CERT_V_START%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书的有效期开始日期。

UDP

未实现 (“-“)。

DOWNSTREAM_PEER_CERT_V_START 可以使用 格式字符串 进行自定义。有关其他格式说明符和示例,请参见 START_TIME

%DOWNSTREAM_PEER_CERT_V_END%
HTTP/TCP/THRIFT

用于建立下游 TLS 连接的客户端证书的有效期结束日期。

UDP

未实现 (“-“)。

DOWNSTREAM_PEER_CERT_V_END 可以使用 格式字符串 进行自定义。有关其他格式说明符和示例,请参见 START_TIME

%UPSTREAM_PEER_SUBJECT%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的对等证书中存在的主题。

UDP

未实现 (“-“)。

%UPSTREAM_PEER_ISSUER%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的对等证书中存在的颁发者。

UDP

未实现 (“-“)。

%UPSTREAM_TLS_SESSION_ID%
HTTP/TCP/THRIFT

已建立的上游 TLS 连接的会话 ID。

UDP

未实现(0)。

%UPSTREAM_TLS_CIPHER%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的密码集的 OpenSSL 名称。

UDP

未实现 (“-“)。

%UPSTREAM_TLS_VERSION%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的 TLS 版本(例如,TLSv1.2TLSv1.3)。

UDP

未实现 (“-“)。

%UPSTREAM_PEER_CERT%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的服务器证书(以 URL 编码的 PEM 格式)。

UDP

未实现 (“-“)。

%UPSTREAM_PEER_CERT_V_START%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的上游服务器证书的有效期开始日期。

UDP

未实现 (“-“)。

UPSTREAM_PEER_CERT_V_START 可以使用 格式字符串 进行自定义。有关其他格式说明符和示例,请参见 START_TIME

%UPSTREAM_PEER_CERT_V_END%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的上游服务器证书的有效期结束日期。

UDP

未实现 (“-“)。

UPSTREAM_PEER_CERT_V_END 可以使用 格式字符串 进行自定义。有关其他格式说明符和示例,请参见 START_TIME

%UPSTREAM_PEER_URI_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的对等证书的 SAN 中存在的 URI。

UDP

未实现 (“-“)。

%UPSTREAM_PEER_DNS_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的对等证书的 SAN 中存在的 DNS 名称。

UDP

未实现 (“-“)。

%UPSTREAM_PEER_IP_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的对等证书的 SAN 中存在的 IP 地址。

UDP

未实现 (“-“)。

%UPSTREAM_LOCAL_URI_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的本地证书的 SAN 中存在的 URI。

UDP

未实现 (“-“)。

%UPSTREAM_LOCAL_DNS_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的本地证书的 SAN 中存在的 DNS 名称。

UDP

未实现 (“-“)。

%UPSTREAM_LOCAL_IP_SAN%
HTTP/TCP/THRIFT

用于建立上游 TLS 连接的本地证书的 SAN 中存在的 IP 地址。

UDP

未实现 (“-“)。

%HOSTNAME%

系统主机名。

%LOCAL_REPLY_BODY%

Envoy 拒绝的请求的正文文本。

%FILTER_CHAIN_NAME%

下游连接的 网络过滤器链名称

%ACCESS_LOG_TYPE%

访问日志的类型,指示记录访问日志的时间。如果使用此替换字符串记录的是不支持的日志(来自以下列表),则该值将为空字符串。

  • TcpUpstreamConnected - 当 TCP 代理过滤器成功建立上游连接时。

  • TcpPeriodic - 在任何 TCP 代理过滤器周期性日志记录时。

  • TcpConnectionEnd - 当 TCP 代理过滤器上的 TCP 连接结束时。

  • DownstreamStart - 当 HTTP 连接管理器过滤器收到新的 HTTP 请求时。

  • DownstreamTunnelSuccessfullyEstablished - 当 HTTP 连接管理器发送响应标头

    表示 HTTP 隧道成功建立时。

  • DownstreamPeriodic - 在任何 HTTP 连接管理器周期性日志记录时。

  • DownstreamEnd - 当 HTTP 连接管理器过滤器上的 HTTP 流结束时。

  • UpstreamPoolReady - 当 HTTP 路由器过滤器收到新的 HTTP 请求时。

  • UpstreamPeriodic - 在任何 HTTP 路由器过滤器周期性日志记录时。

  • UpstreamEnd - 当 HTTP 路由器过滤器上的 HTTP 请求完成时。

  • UdpTunnelUpstreamConnected - 当 UDP 代理过滤器成功建立上游连接时。

    注意:仅与通过 HTTP 进行的 UDP 隧道相关。

  • UdpPeriodic - 在任何 UDP 代理过滤器周期性日志记录时。

  • UdpSessionEnd - 当 UDP 代理过滤器上的 UDP 会话结束时。

%UNIQUE_ID%

动态生成的唯一标识符 (UUID)。

%ENVIRONMENT(X):Z%

环境变量 X 的环境值。如果不存在有效的环境变量 X,则使用“-”符号。Z 是一个可选参数,表示字符串截断到 Z 个字符长。

%TRACE_ID%
HTTP

请求的跟踪 ID。如果请求没有跟踪 ID,则为空字符串。

TCP/UDP

未实现 (“-“)。