如何将 google-api-client 用于 Google Cloud Logging
How to use google-api-client for Google Cloud Logging
我想从 python 脚本访问 Google 云平台日志记录。
我可以从 https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/list 访问此日志 --> 试试这个 API
现在我想得到相同的,但是来自 Python 脚本。我在之前的步骤中看到,自动创建了一个授权令牌。
我正在尝试使用此代码示例,但我不知道如何 POST 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 脚本生成此令牌.
谢谢!
这不太容易找到,因为许多 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
我正在使用以下代码示例从 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 脚本并从日志记录中获取最后 5 个条目。我的问题是此代码示例开始提取条目,但它永远不会停止。如何限制条目数?
谢谢!
好的,感谢 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))
NOTE forcing HTTP entails logger.list_entries
returning an HTTPIterator
instead of a (gRPC) generator
hence the ability to use next()
and the pages
property.
NOTE The 'trick' is to only enumerate the first page of n results. There may be multiple pages but we ignore subsequent ones.
我想从 python 脚本访问 Google 云平台日志记录。
我可以从 https://cloud.google.com/logging/docs/reference/v2/rest/v2/entries/list 访问此日志 --> 试试这个 API
现在我想得到相同的,但是来自 Python 脚本。我在之前的步骤中看到,自动创建了一个授权令牌。
我正在尝试使用此代码示例,但我不知道如何 POST 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 脚本生成此令牌.
谢谢!
这不太容易找到,因为许多 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
我正在使用以下代码示例从 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 脚本并从日志记录中获取最后 5 个条目。我的问题是此代码示例开始提取条目,但它永远不会停止。如何限制条目数?
谢谢!
好的,感谢 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))
NOTE forcing HTTP entails
logger.list_entries
returning anHTTPIterator
instead of a (gRPC)generator
hence the ability to usenext()
and thepages
property.
NOTE The 'trick' is to only enumerate the first page of n results. There may be multiple pages but we ignore subsequent ones.