访问日志是了解业务和服务网格运行状态的重要观测渠道。在访问量较大的业务场景中,按照特定条件过滤日志,可以节约Sidecar的性能开销,并专注于关键日志内容。ASM支持使用CEL(Common Expression Language)语言设置日志过滤规则。本文介绍ASM AccessLog CEL过滤的使用方法和CEL支持的字段,帮助您自定义配置过滤规则。
过滤规则
CEL表达式返回为真的访问日志将被输出,反之不会输出。
场景示例
示例一:仅输出响应状态码为400以上的访问日志
response.code >= 400
response.code
表示HTTP Response的HTTP Status。当HTTP Status≥400时,表达式为真,输出该请求的访问日志。
示例二:仅输出请求URI中包含login字样的访问日志
request.url_path.contains('login')
request.url_path
表示HTTP Request的路径(不包含query串)。contains
是CEL标准的字符串方法,返回布尔值,用于判断字符串是否包含给定的子串。当request.url_path
包含login
子串时,表达式为真,输出该请求的访问日志。
示例三:使用逻辑与、逻辑或进行多个条件判断
逻辑与(&&)
request.url_path.contains('login') && request.headers['x-user-type'] == 'dev'
request.url_path
表示HTTP Request的路径(不包含query串)。request.headers
表示请求中的请求头,类型为map<string, string>。当请求的
url_path
包含login
,且请求携带了x-user-type
请求头,且该请求头的value为dev
时,输出该请求的访问日志。
逻辑或(||)
request.url_path.contains('login') || request.url_path.contains('logout')
request.url_path
表示HTTP Request的路径(不包含query串)。当请求的
url_path
包含login
或者logout
时,输出该请求的访问日志。
CEL支持的字段说明
请求属性
属性 | 类型 | 说明 |
request.path | string | URL的路径部分。 |
request.url_path | string | URL的路径部分,但不包含query串。 |
request.host | string | URL的主机名部分。 |
request.scheme | string | URL中的Scheme部分,例如HTTP、HTTPS。 |
request.method | string | 请求方法,例如GET、POST。 |
request.headers | map<string, string> | 所有请求Header的map。 |
request.referer | string | 请求中Refer头的值。 |
request.useragent | string | 请求携带的User-Agent请求头的值。 |
request.time | timestamp | 收到请求的首个字节的时间戳。 |
request.id | string | 请求携带的x-request-id请求头的值。 |
request.protocol | string | 请求协议,例如HTTP/1.0、HTTP/1、HTTP/2或HTTP/3。 |
request.query | string | URL中的query串部分,例如name1=value1&name2=value2。 |
request.duration | duration | 请求花费的总时长。 |
request.size | int | 请求体的大小,如果Content-Length请求头存在,则使用它的值。 |
request.total_size | int | 包含请求头的完整请求大小。 |
响应属性
属性 | 类型 | 说明 |
response.code | int | 请求响应的HTTP状态码。 |
response.code_details | string | 响应状态码的描述信息。 |
response.flags | int | 除响应HTTP状态码之外的额外信息,以Bit Vector形式编码。 |
response.grpc_status | int | 响应的GRPC状态码。 |
response.headers | map<string, string> | 所有响应Header的map。 |
response.trailers | map<string, string> | 所有响应中携带的Trailer的map。 |
response.size | int | 响应体大小。 |
response.total_size | int | 包含响应头的完整响应大小。 |
下游属性
属性 | 类型 | 说明 |
source.address | string | 下游连接客户端的地址。 |
source.port | int | 下游连接客户端的端口。 |
destination.address | string | 下游连接的目标地址。 |
destination.port | int | 下游连接的目标端口。 |
connection.id | uint | 下游连接的ID。 |
connection.mtls | bool | 是否在下游连接上启用了TLS以及下游连接是否携带了证书。 |
connection.requested_server_name | string | 下游TLS连接请求的服务器名称。 |
connection.tls_version | string | 下游连接的TLS版本。 |
connection.subject_local_certificate | string | 下游连接服务端证书的Subject字段。 |
connection.subject_peer_certificate | string | 下游连接客户端证书的Subject字段。 |
connection.dns_san_local_certificate | string | 下游TLS连接中服务端证书的SAN字段中的第一个DNS条目。 |
connection.dns_san_peer_certificate | string | 下游TLS连接中客户端证书的SAN字段中的第一个DNS条目。 |
connection.uri_san_local_certificate | string | 下游TLS连接中服务端证书的SAN字段中的第一个URI条目。 |
connection.uri_san_peer_certificate | string | 下游TLS连接中客户端证书的SAN字段中的第一个URI条目。 |
connection.sha256_peer_certificate_digest | string | 下游TLS连接中客户端证书的SHA256哈希串。 |
connection.transport_failure_reason | string | 传输失败的原因,例如certificate validation failed。 |
上游属性
属性 | 类型 | 说明 |
upstream.address | string | 上游连接的目标地址。 |
upstream.port | int | 上游连接的目标端口。 |
upstream.tls_version | string | 上游连接的TLS版本。 |
upstream.subject_local_certificate | string | 上游连接使用的客户端证书的Subject字段的值。 |
upstream.subject_peer_certificate | string | 上游连接使用的服务端证书的Subject字段的值。 |
upstream.dns_san_local_certificate | string | 上游连接客户端证书中的SAN字段中的第一个DNS条目。 |
upstream.dns_san_peer_certificate | string | 上游连接服务端证书中的SAN字段中的第一个DNS条目。 |
upstream.uri_san_local_certificate | string | 上游连接客户端证书中的SAN字段中的第一个URI条目。 |
upstream.uri_san_peer_certificate | string | 上游连接服务端证书中的SAN字段中的第一个URI条目。 |
upstream.sha256_peer_certificate_digest | string | 下游TLS连接中服务端证书的SHA256哈希串。 |
upstream.local_address | string | 上游连接的客户端本地地址。 |
upstream.transport_failure_reason | string | 上游传输失败原因,例如certificate validation failed。 |