使用 Python 查询 GCP Stackdriver 日志

Rhi*_*guy 6 google-bigquery google-cloud-logging stackdriver google-cloud-python google-cloud-stackdriver

我正在使用 Python3 查询 Stackdriver 以获取 GCP 日志。不幸的是,具有重要数据的日志条目以“NoneType”而不是“dict”或“str”的形式返回给我。结果“entry.payload”是“None”类型,“entry.payload_pb”有我想要的数据,但是是乱码。

有没有办法让 Stackdriver 以干净的格式返回这些数据,或者有没有办法解析它?如果没有,有没有办法查询比我正在做的更好的数据并产生干净的数据?

我的代码看起来像这样:

#!/usr/bin/python3

from google.cloud.logging import Client, ASCENDING, DESCENDING
from google.oauth2.service_account import Credentials

projectName = 'my_project'
myFilter = 'logName="projects/' + projectName + '/logs/compute.googleapis.com%2Factivity_log"'

client = Client(project = projectName)
entries = client.list_entries(order_by=DESCENDING, page_size = 500, filter_ = myFilter)
for entry in entries:
    if isinstance(entry.payload, dict):
        print(entry.payload)
    if isinstance(entry.payload, str):
        print(entry.payload)
    if isinstance(entry.payload, None):
        print(entry.payload_pb)
Run Code Online (Sandbox Code Playgroud)

“entry.payload_pb”数据总是这样开头:

type_url: "type.googleapis.com/google.cloud.audit.AuditLog"
 value: "\032;\n9gcp-user@my-project.iam.gserviceaccount.com"I\n\r129.105.16.28\0228
Run Code Online (Sandbox Code Playgroud)

Ale*_*kin 1

看起来 python 库中与解析 protobuf 以进行日志记录相关的某些内容已损坏。发现两个老问题

  1. https://github.com/GoogleCloudPlatform/google-cloud-python/issues/3218
  2. https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2674

这似乎在不久前就得到了解决 - 但我相信问题又重新出现了。我已经就这个问题向谷歌支持开票了,他们正在调查这个问题。

作为解决方法 - 您可以使用两个选项:

  1. 您可以创建到 BigQuery 的导出(接收器) - 因此在这种情况下您可以轻松查询日志 - 这种方法的问题是它不会导出您在创建导出之前收集的旧数据。
  2. 您可以使用 gcloud 命令。尤其

    gcloud 日志记录读取

它非常强大(支持过滤器、时间戳)——但它的输出格式是yaml。您可以安装并使用 PyYAML 库将日志转换为字典。