You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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等审计信息,还能关联到对应的自定义日志条目。

查看审计日志的操作步骤:

  1. 打开Logs Explorer,选择Cloud Audit Logs -> Data Access日志类别
  2. 使用过滤条件定位日志写入操作:
protoPayload.methodName="google.logging.v2.LoggingServiceV2.WriteLogEntries"
  1. 每条审计日志中可获取以下关键信息:
    • protoPayload.authenticationInfo.principalEmail:写入日志的服务账号邮箱
    • protoPayload.requestMetadata.callerIp:客户端的公网IP
    • protoPayload.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:25:02