如何在GCP Logs Explorer按服务账号/IP过滤日志及查看相关字段?
外部Python应用写入GCP Logging:服务账号/IP标识与过滤方案
核心原因
用google-cloud-logging客户端直接提交的自定义日志,GCP不会自动附加服务账号、客户端IP这类元数据——这类审计信息仅会自动出现在GCP内部服务日志、或是针对Logging API的审计日志中。自定义日志属于用户主动提交的内容,默认不带这类字段,需要手动处理或通过审计日志追溯。
方案1:手动给日志添加标识字段
最直接的方式是构造日志条目时,主动加入服务账号、IP、客户端ID等信息,示例代码如下:
import google.cloud.logging import json import socket import requests # 初始化日志客户端(自动加载本地JSON密钥文件) client = google.cloud.logging.Client() logger = client.logger("my-external-app-log") # 从服务账号密钥文件读取邮箱 with open("your-service-account-key.json") as f: sa_data = json.load(f) sa_email = sa_data["client_email"] # 获取客户端IP(优先公网IP,失败则返回本地IP) def get_client_ip(): try: return requests.get("https://api.ipify.org", timeout=5).text except: return socket.gethostbyname(socket.gethostname()) # 构造带元数据的日志内容 log_content = { "message": "用户提交了订单请求", "app_metadata": { "service_account": sa_email, "client_ip": get_client_ip(), "client_id": "app-instance-001" # 可自定义为应用实例ID、客户端唯一标识 } } # 写入日志 logger.log_struct(log_content)
写入后,可在Logs Explorer中通过以下条件过滤:
- 按服务账号筛选:
jsonPayload.app_metadata.service_account="your-sa@your-project.iam.gserviceaccount.com" - 按客户端IP筛选:
jsonPayload.app_metadata.client_ip="123.45.67.89"
方案2:通过GCP审计日志追溯写入行为
所有对Logging API的写入请求,都会被记录在数据访问审计日志中,这里自带服务账号、客户端IP等审计信息,还能关联到对应的自定义日志条目。
查看审计日志的操作步骤:
- 打开Logs Explorer,选择
Cloud Audit Logs->Data Access日志类别 - 使用过滤条件定位日志写入操作:
protoPayload.methodName="google.logging.v2.LoggingServiceV2.WriteLogEntries"
- 每条审计日志中可获取以下关键信息:
protoPayload.authenticationInfo.principalEmail:写入日志的服务账号邮箱protoPayload.requestMetadata.callerIp:客户端的公网IPprotoPayload.request.resourceName:对应的日志名称/项目,用于关联自定义日志条目
若要按服务账号过滤审计日志,直接追加条件:
protoPayload.authenticationInfo.principalEmail="your-sa@your-project.iam.gserviceaccount.com"
方案3:自动注入服务账号信息
如果不想手动读取密钥文件,可通过google-auth库直接获取当前认证凭据的服务账号信息:
import google.cloud.logging from google.auth import default client = google.cloud.logging.Client() logger = client.logger("my-external-app-log") # 获取当前认证的服务账号邮箱 credentials, _ = default() sa_email = credentials.service_account_email if hasattr(credentials, 'service_account_email') else "unknown-sa" # 写入带服务账号标识的日志 logger.log_struct({ "message": "系统初始化完成", "service_account": sa_email })
内容的提问来源于stack exchange,提问作者Michael B
相关产品推荐
相关产品推荐

