关于 VPC 流日志记录
本页面介绍了 VPC 流日志记录格式,包括可用的基本字段和元数据字段,还介绍了如何使用日志过滤,以便仅生成符合特定条件的日志。
记录格式
日志记录包含基本字段(即每个日志记录的核心字段)以及添加额外信息的元数据字段。可以省略元数据字段,以节省存储费用。
某些日志字段采用多字段格式,在给定字段中包含多段数据。例如,connection
字段采用 IpConnection
格式,它在单个字段中包含来源 IP 地址和目的地 IP 地址、端口以及协议。记录格式表下方介绍了这些采用多字段格式的字段。
元数据字段的值并非基于数据层面路径;这些值属于近似值,可能缺失或不正确。与元数据字段不同,基本字段的值直接取自数据包标头。
字段 | 字段格式 | 字段类型:基本或可选元数据 |
---|---|---|
connection |
IpConnection
描述流的 5 元组。 |
基本 |
reporter |
字符串
报告流的一方。可以是 SRC 、DEST 、SRC_GATEWAY 或 DEST_GATEWAY 。
|
基本 |
rtt_msec |
int64
在时间间隔内测量的延迟时间。此字段仅适用于从虚拟机报告的 TCP 流量。测量延迟是发送 SEQ 和接收相应的 ACK 之间所经历的时间。延迟结果是网络 RTT 与应用所耗用的时间之和。 |
基本 |
bytes_sent |
int64
从来源发送到目的地的字节数。 |
基本 |
packets_sent |
int64
从来源发送到目的地的数据包数量。 |
基本 |
start_time |
字符串
在汇总时间间隔内观察到的第一个数据包的时间戳(RFC 3339 日期字符串格式) |
基本 |
end_time |
字符串
在汇总时间间隔内观察到的最后一个数据包的时间戳(RFC 3339 日期字符串格式)。 |
基本 |
来源和目标元数据字段 | ||
src_gateway |
GatewayDetails
如果流的来源是通过网关(例如 Cloud Interconnect 的 VLAN 连接或 Cloud VPN 隧道)连接到 Google Cloud 的本地端点或其他云端点,并且满足以下任一条件,则此字段会填充网关详情:
|
元数据 |
dest_gateway |
GatewayDetails
如果流的目的地是通过网关(例如 Cloud Interconnect 的 VLAN 连接或 Cloud VPN 隧道)连接到 Google Cloud 的本地端点或其他云端点,并且满足以下任一条件,则此字段会填充网关详情:
|
元数据 |
src_gke_details |
GkeDetails
如果流的来源是 Google Kubernetes Engine (GKE) 端点,则此字段会填充 GKE 端点详情。 |
元数据 |
dest_gke_details |
GkeDetails
如果流的目的地是 GKE 端点,则此字段会填充 GKE 端点详情。 |
元数据 |
src_google_service |
GoogleServiceDetails
如果流的来源是某个 Google API,则此字段会填充可用的 Google API 元数据。 |
元数据 |
dest_google_service |
GoogleServiceDetails
如果流的目的地是 Google API,则此字段会填充可用的 Google API 元数据。 |
元数据 |
src_instance |
InstanceDetails
如果流的来源是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充虚拟机实例详情:
|
元数据 |
dest_instance |
InstanceDetails
如果流的目的地是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充虚拟机实例详情。
|
元数据 |
src_location |
GeographicDetails
如果流的来源是位于 VPC 网络之外的公共 IP 地址,则此字段会填充可用位置元数据。 |
元数据 |
dest_location |
GeographicDetails
如果流的目的地是 VPC 网络之外的公共 IP 地址,则此字段会填充可用位置元数据。 |
元数据 |
src_vpc |
VpcDetails
如果流的来源是 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充 VPC 网络详情:
|
元数据 |
dest_vpc |
VpcDetails
如果流的目的地是位于 VPC 网络中的虚拟机,并且满足以下任一条件,则此字段会填充 VPC 网络详情:
|
元数据 |
其他元数据字段 | ||
internet_routing_details |
InternetRoutingDetails
如果流是 Google Cloud 与互联网之间的连接,则此字段会填充路由详情。仅适用于出站流。 |
元数据 |
load_balancing |
LoadBalancingDetails
如果流通过以下配置之一中的负载均衡器,则此字段会填充 Cloud Load Balancing 详情:
|
元数据 |
network_service |
NetworkServiceDetails
如果设置了差分服务代码点 (DSCP) 标头,则此字段会填充网络服务详情。 |
元数据 |
psc |
PrivateServiceConnectDetails
如果流通过以下任一配置中的 Private Service Connect,则此字段会填充 Private Service Connect 详情:
|
元数据 |
IpConnection 字段格式
字段 | 类型 | 说明 |
---|---|---|
协议 | int32 | IANA 协议编号 |
src_ip | 字符串 | 来源 IP 地址 |
dest_ip | 字符串 | 目标 IP 地址 |
src_port | int32 | 来源端口 |
dest_port | int32 | 目标端口 |
GatewayDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
project_id | 字符串 | 网关的 Google Cloud 项目 ID |
地理位置 | 字符串 | 网关所在的区域 |
name | 字符串 | 网关名称 |
type | 字符串 |
网关类型。可以是 INTERCONNECT_ATTACHMENT 或 VPN_TUNNEL 。
|
vpc | VpcDetails | 网关的 VPC 网络详情 |
GkeDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
集群 | ClusterDetails | GKE 集群元数据 |
Pod | PodDetails | GKE Pod 元数据,当流量的来源或目的地是 Pod 时填充 |
服务 | ServiceDetails |
GKE Service 元数据,仅填充在 Service 端点中。记录最多包含两项 Service。如果有两项以上的相关 Service,则此字段包含一个带有特殊 MANY_SERVICES 标记的 Service。 |
ClusterDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
cluster_location | 字符串 | 集群的位置。这可以是可用区或区域,具体取决于集群是可用区级还是区域级集群。 |
cluster_name | 字符串 | GKE 集群名称。 |
PodDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
pod_name | 字符串 | Pod 的名称 |
pod_namespace | 字符串 | Pod 的命名空间 |
pod_workload | WorkloadDetails | 与控制 Pod 的顶级工作负载资源相关的元数据 |
WorkloadDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
workload_name | 字符串 | 顶级工作负载控制器的名称 |
workload_type | 字符串 |
顶级工作负载控制器的类型。可以是 DEPLOYMENT 、REPLICA_SET 、STATEFUL_SET 、DAEMON_SET 、JOB 、CRON_JOB 或 REPLICATION_CONTROLLER 。 |
ServiceDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
service_name | 字符串 |
Service 的名称。如果有两个以上的相关 Service,则该字段设置为特殊 MANY_SERVICES 标记。 |
service_namespace | 字符串 | Service 的命名空间 |
示例:
如果有两项 Service,则 Service 字段如下所示:
service: [ 0: { service_name: "my-lb-service" service_namespace: "default" } 1: { service_name: "my-lb-service2" service_namespace: "default" } ]
如果有两项以上的 Service,则 Service 字段如下所示:
service: [ 0: { service_name: "MANY_SERVICES" } ]
GoogleServiceDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
type | 字符串 | 此字段设置为 GOOGLE_API 。 |
InstanceDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
project_id | 字符串 | 包含虚拟机资源的 Google Cloud 项目的 ID |
区域 | 字符串 | 虚拟机的区域 |
vm_name | 字符串 | 虚拟机的实例名称 |
可用区 | 字符串 | 虚拟机的地区 |
GeographicDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
asn | int32 | 此端点所属的外部网络的 ASN。 |
城市 | 字符串 | 外部端点所在的城市 |
continent | 字符串 | 外部端点所在的大洲 |
国家/地区 | 字符串 | 外部端点所在的国家/地区,采用 ISO 3166-1 Alpha-3 国家/地区代码的形式表示 |
区域 | 字符串 | 外部端点所在的区域 |
VpcDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
project_id | 字符串 | 包含 VPC 的 Google Cloud 项目的 ID。在共享 VPC 配置中,project_id 是宿主项目的 ID。 |
subnetwork_name | 字符串 | 子网的名称(如果适用) |
subnetwork_region | 字符串 | 子网的区域(如果适用) |
vpc_name | 字符串 | 网络的名称 |
InternetRoutingDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
egress_as_path | AsPath | 相关 AS 路径的列表。如果流有多个可用的 AS 路径,则该字段可能包含多个 AS 路径。 |
AsPath 字段格式
字段 | 类型 | 说明 |
---|---|---|
as_details | AsDetails | AS 路径中所有系统的 AS 详细信息列表。该列表从 Google Cloud 网络的外部第一个 AS 开始,以远程 IP 地址所属的 AS 结束。 |
AsDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
asn | uint32 | AS 的自治系统编号 (ASN) |
LoadBalancingDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
forwarding_rule_project_id | 字符串 | 转发规则的 Google Cloud 项目 ID |
reporter | 字符串 | Cloud Load Balancing 报告程序。可以是 CLIENT 或 BACKEND 。
|
type | 字符串 | 负载均衡器类型。可以是 APPLICATION_LOAD_BALANCER 、PROXY_NETWORK_LOAD_BALANCER 、PASSTHROUGH_NETWORK_LOAD_BALANCER 或 PROTOCOL_FORWARDING 。 |
scheme | 字符串 | 负载均衡器方案。可以是 EXTERNAL_MANAGED 、INTERNAL_MANAGED 、EXTERNAL 、INTERNAL 或 INTERNAL_SELF_MANAGED 。 |
url_map_name | 字符串 | 网址映射的名称。如果负载均衡器的类型为 APPLICATION_LOAD_BALANCER ,则予以填充。 |
forwarding_rule_name | 字符串 | 转发规则的名称 |
backend_service_name | 字符串 | 后端服务的名称。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER ,则予以填充。如果后端群组类型为 TARGET_POOL ,则系统不会填充此字段。 |
backend_group_name | 字符串 | 后端群组的名称。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER ,则予以填充。 |
backend_group_type | 字符串 | 后端群组的类型。可以是 INSTANCE_GROUP 、NETWORK_ENDPOINT_GROUP 或 TARGET_POOL 。如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER ,则予以填充。 |
backend_group_location | 字符串 | 后端组的位置。可以是可用区或区域,具体取决于后端组的范围是可用区级还是区域级。
如果报告程序为 BACKEND 且负载均衡器类型为 PASSTHROUGH_NETWORK_LOAD_BALANCER ,则予以填充。如果后端群组类型为 TARGET_POOL ,则系统不会填充此字段。 |
vpc | VpcDetails | 负载均衡器的 VPC 网络详情 |
NetworkServiceDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
dscp | int32 | 如果数据包标头中存在差分服务字段,则此字段会填充 DSCP 值。 |
PrivateServiceConnectDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
reporter | 字符串 | Private Service Connect 报告程序。可以是 CONSUMER 或 PRODUCER 。 |
psc_endpoint | PrivateServiceConnectEndpointDetails |
端点详情。如果报告程序为 CONSUMER ,则予以填充。 |
psc_attachment | PrivateServiceConnectAttachmentDetails | 服务连接详情。如果流量流包含 Private Service Connect 提供方,则予以填充。 |
PrivateServiceConnectEndpointDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
project_id | 字符串 | Private Service Connect 端点的 Google Cloud 项目 ID |
区域 | 字符串 | 端点所在的区域。如果目标服务类型为 GLOBAL_GOOGLE_APIS ,则不予以填充。 |
psc_connection_id | 字符串 | Private Service Connect 连接 ID |
target_service_type | 字符串 | 目标服务类型。可以是 GLOBAL_GOOGLE_APIS 或 PUBLISHED_SERVICE 。 |
vpc | VpcDetails | Private Service Connect 端点的 VPC 网络详情 |
PrivateServiceConnectAttachmentDetails 字段格式
字段 | 类型 | 说明 |
---|---|---|
project_id | 字符串 | 服务连接的 Google Cloud 项目 ID |
区域 | 字符串 | 服务连接的区域 |
vpc | VpcDetails | 服务连接的 VPC 网络详情 |
元数据注解
日志记录包含基本字段和元数据字段。记录格式部分列出了哪些字段是元数据类型,哪些是基本类型。所有基本字段始终包含在内。您可以自定义要保留哪些元数据字段。
如果您选择了所有元数据,则流日志将包含 VPC 流日志记录格式中的所有元数据字段。向记录格式添加新的元数据字段后,流日志会自动包含新字段。
如果您不选择任何元数据,则所有元数据字段都将被忽略。
如果选择自定义元数据,您可以通过父字段(如
src_vpc
)或其全名(如src_vpc.project_id
)指定要包含的元数据字段将新的元数据字段添加到记录格式后,这些字段会从流日志中排除,除非它们位于您指定要包含的父字段中。
如果使用父字段指定自定义元数据,则在向父字段内的记录格式添加新元数据字段后,流日志将自动包含新字段。
如果使用字段的全名指定自定义元数据,则添加到父字段的新元数据字段会从流日志中排除。
如需了解如何自定义元数据字段,请参阅在创建子网时启用 VPC 流日志记录的 Google Cloud CLI 或 API 说明。
GKE 元数据注解
在 GKE 集群中具有端点的流可以使用 GKE 元数据注释进行注释,其中可以包含该端点的集群、Pod 和 Service 的详细信息。
GKE Service 注释
发送到 ClusterIP、NodePort 或 LoadBalancer 的流量可以接收 Service 注释。如果发送到 NodePort 或 LoadBalancer,则流在连接的两个跃点上接收 Service 注释。
直接发送到 Pod 的 Service 端口的流量通过目的地端点上的 Service 注释进行注释。
发送到 Pod 的 Service 端口的流量(其中 Pod 支持同一 Service 端口上的多个 Service)在目的地端点上标注了多个 Service。这仅限于两项 Service。如果超过了该数量,端点将带有一个特殊的 MANY_SERVICES
标记。
互联网流量上的 Pod 注释
默认情况下,Pod 和互联网之间的流量不会接收 Pod 注解。VPC 流日志无法添加 Pod 注解,因为对于发送到互联网的数据包,伪装代理会在 VPC 流日志查看数据包之前将 Pod IP 地址转换为节点 IP 地址。
由于伪装问题,仅当目的地位于默认非伪装目的地或自定义 nonMasqueradeCIDRs
列表之一时,Pod 注释才可见。如果您将互联网目的地添加到自定义 nonMasqueradeCIDRs
列表中,则需要提供一种方法来转换内部 Pod IP 地址,然后才将其传送到互联网。对于专用集群和非专用集群,您可以使用 Cloud NAT。如需了解详情,请参阅 GKE 互动。
日志过滤
启用 VPC 流日志时,您可以根据基本字段和元数据字段设置过滤条件,以仅保留与该过滤条件匹配的日志。所有其他日志在写入 Logging 之前都会被舍弃,这样可以节省资金并缩短查找所需信息的时间。
您可以根据记录格式中列出的任意字段子集进行过滤,但以下字段除外:
rtt_msec
bytes_sent
packets_sent
start_time
end_time
VPC 流日志过滤使用 CEL,这是一种基于特性 (Attribute) 的逻辑表达式的嵌入式表达式语言。VPC 流日志的过滤表达式不得超过 2,048 个字符。如需了解详情,请参阅支持的 CEL 逻辑运算符。
如需详细了解 CEL,请参阅 CEL 简介和语言定义。生成过滤器功能仅支持有限的 CEL 语法子集。
如需了解如何创建使用日志过滤的子网,请参阅有关创建子网时启用 VPC 流日志的 gcloud CLI 或 API 说明。
如需了解如何配置日志过滤,请参阅 gcloud CLI 或 API 说明,了解如何更新 VPC 流日志参数。
示例 1:只允许收集名为 my-vm
的特定虚拟机的日志。在这种情况下,仅记录符合下列条件的日志:流量来源报告的 src_instance
字段为 my-vm
,或者流量目的地报告的 dst_instance
字段为 my-vm
。
gcloud compute networks subnets update my-subnet \ --logging-filter-expr="(src_instance.vm_name == 'my-vm' && reporter=='SRC') || (dest_instance.vm_name == 'my-vm' && reporter=='DEST')"
示例 2:只允许收集其来源 IP 地址位于 10.0.0.0/8
子网中的数据包的日志。
gcloud compute networks subnets update my-subnet \ --logging-filter-expr="inIpRange(connection.src_ip, '10.0.0.0/8')"
示例 3:只收集 VPC 外部流量的日志。
gcloud compute networks subnets update my-subnet \ --logging-filter-expr '!(has(src_vpc.vpc_name) && has(dest_vpc.vpc_name))'
支持的 CEL 逻辑运算符
表达式 | 受支持的类型 | 说明 |
---|---|---|
true、false | 布尔值 | 布尔常量 |
x == y x != y |
布尔值、整数、字符串 | 比较运算符 示例:connection.protocol == 6 |
x && y x || y |
布尔值 | 布尔值逻辑运算符 示例:connection.protocol == 6 && src_instance.vm_name == "vm_1" |
!x | 布尔值 | 取反 |
1, 2.0, 0, ... | Int | 数字字面常量 |
x + y | 字符串 | 字符串串联 |
"foo", 'foo', ... | 字符串 | 字符串字面常量 |
x.lower() | 字符串 | 返回字符串 x 的小写值 |
x.upper() | 字符串 | 返回字符串 x 的大写值 |
x.contains(y) | 字符串 | 如果字符串包含指定的子字符串,则返回 true |
x.startsWith(y) | 字符串 | 如果字符串以指定的子字符串开头,则返回 true |
x.endsWith(y) | 字符串 | 如果字符串以指定的子字符串结尾,则返回 true |
inIpRange(X, Y) | 字符串 | 如果 X 是 IP 地址且 Y 是包含 X 的 IP 地址范围,则返回 true 示例:inIpRange("1.2.3.1", "1.2.3.0/24") |
x.containsFieldValue(y) |
x: list y: map(string, string) |
如果列表包含的对象的字段与指定的键值对匹配,则返回 true 示例:dest_gke_details.service.containsFieldValue({'service_name': 'service1', 'service_namespace': 'namespace1'}) |
has(x) | 字符串 | 如果该字段存在,则返回 true。 |