【问题标题】:How to use google-api-client for Google Cloud Logging如何将 google-api-client 用于 Google Cloud Logging
【发布时间】:2021-05-27 23:49:09
【问题描述】:

我想通过 python 脚本访问 Google Cloud Platform Logging。

我可以从https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/list 访问这些日志 --> 试试这个 API

现在我想获得相同的结果,但来自 Python 脚本。我在之前的步骤中看到,自动创建了一个授权令牌。

我正在尝试使用此代码示例,但后来我不知道如何使用发现发布 https://logging.googleapis.com/v2/entries:list

from google.oauth2 import service_account
import googleapiclient.discovery

credentials = service_account.Credentials.from_service_account_file(service_account_file)
logging = googleapiclient.discovery.build('logging', 'v2', credentials=credentials)

然后我尝试了这个代码示例:

import requests
payload = {
    "projectIds": [
        "my-proyect"
    ],
    "resourceNames": [],
    "filter": "resource.type=cloudiot_device",
    "orderBy": "timestamp desc",
    "pageSize": 1
}
headers = {"Authorization": "Bearer AAAAAAA"}
r = requests.post("https://logging.googleapis.com/v2/entries:list", params=payload, headers=headers)

该代码示例工作正常,但它放置 AAAAAAA 令牌的位置我复制并粘贴了我在 https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/list 中看到的代码,但我不知道如何从 python 脚本生成此令牌。

谢谢!

【问题讨论】:

  • 嗨米克尔。在 Stack Overflow 中,预计在提出问题时您已经尝试过某些内容并将您尝试过的内容包含在问题中,以便社区可以从那里开始。 Here 是一个很好的视频来解释这一点。如果你想看看 Stack Overflow 上关于如何提问的内容是 here
  • 对我来说,你的问题就像你在找人来做你的工作。 “我怎么能得到那个?我不太明白如何获得授权令牌。”不是一个有效的问题。您应该尝试一下,并在您的实施中提出任何具体问题

标签: python-3.x google-app-engine google-api-client google-cloud-logging


【解决方案1】:

这不太容易找到,因为 Google 的许多云 (!) 服务现在更喜欢云客户端库。

不过……

import google.auth

from googleapiclient import discovery

credentials, project = google.auth.default()

service = discovery.build("logging", "v2", credentials=credentials)

授权:https://pypi.org/project/google-auth/

现在,这使用 Google 应用程序默认凭据,我建议您创建一个服务帐户,生成一个密钥并授予该帐户所需的权限。然后,您需要在运行代码之前导出 GOOGLE_APPLICATION_CREDENTIALS

PROJECT=[[YOUR-PROJECT]]
BILLING=[[YOUR-BILLING]]
ACCOUNT=[[YOUR-ACCOUNT]]

gcloud projects create ${PROJECT}
gcloud beta billing projects link ${PROJECT} \
--billing-account=${BILLING}

gcloud iam service-accounts create ${ACCOUNT} \
--project=${PROJECT}

EMAIL="${ACCOUNT}@${PROJECT}.iam.gserviceaccount.com"

gcloud iam service-accounts keys create ${PWD}/${ACCOUNT}.json \
--iam-account=${EMAIL} \
--project=${PROJECT}

# See: https://cloud.google.com/iam/docs/understanding-roles#logging-roles
gcloud projects add-iam-policy-binding ${PROJECT} \
--member=serviceAccount:${EMAIL} \
--role=roles/logging.viewer

export GOOGLE_APPLICATION_CREDENTIALS=${PWD}/${ACCOUNT}.json

python3 your-code.py

【讨论】:

  • 嗨@DazWilkin!我可以使用 Cloud Client 库和服务帐户授权从 Google Cloud Logging 中提取数据。谢谢!我将附在我正在使用的代码示例下方。我的疑问是如何限制条目数,因为此代码示例开始运行并且不会停止。
【解决方案2】:

好的,感谢 Google Engineer,解决方案的第一部分是禁用 SDK 对 gRPC 的使用并强制 HTTP,以便尊重 page_size

client = logging.Client(_use_grpc=0)

您也可以GOOGLE_CLOUD_DISABLE_GRPC="{{anything}}"

解决方案的第二部分是只遍历page_size结果的第一页:

iterator = logger.list_entries(
    order_by=DESCENDING,
    page_size=page_size,
)
print(type(iterator))

for entry in next(iterator.pages):
    timestamp = entry.timestamp.isoformat()
    print("{}".format(timestamp))

注意强制 HTTP 需要 logger.list_entries 返回 HTTPIterator 而不是 (gRPC) generator,因此可以使用 next()pages 属性。

注意“诀窍”是仅枚举 n 个结果的第一页。可能有多个页面,但我们忽略后续页面。

【讨论】:

    【解决方案3】:

    我正在使用以下代码示例从 Google Cloud Logging 中提取日志信息。

    import os
    from google.cloud import logging
    from google.cloud.logging import DESCENDING
    
    os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "my-service-account-file"
    
    def list_entries(logger_name):
        """Lists the most recent entries for a given logger."""
        logging_client = logging.Client()
        logger = logging_client.logger(logger_name)
        print("Listing entries for logger {}:".format(logger.name))
        filter_str = "resource.type=cloudiot_device AND resource.labels.device_num_id=00000000000 AND jsonPayload.eventType=PUBLISH"
        for entry in logger.list_entries(filter_=filter_str, order_by=DESCENDING, page_size=10):
            timestamp = entry.timestamp.isoformat()
            print(" {}: {}".format(, timestamp, entry.payload))
    
    list_entries("cloudiot.googleapis.com%2Fdevice_activity")

    我的目标是每 5 分钟运行一次这个 python 脚本,并从 Logging 中获取最后 5 个条目。我的问题是这个代码示例开始提取条目,但它永远不会停止。如何限制条目数量?

    谢谢!

    猜你喜欢
    • 2016-03-11
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多