8

我正在使用 Google 的Stackdriver Logging Client Libraries for Python以编程方式检索日志条目,类似于使用gcloud beta logging read.

Stackdriver 还提供了一个 API 来检索日志名称列表,这很可能是gcloud beta logging logs list使用的。

如何将该 API 与 Python 客户端库一起使用?我在文档中找不到任何东西。

4

2 回答 2

10

您可以使用适用于 Python 的Stackdriver Logging 客户端库。您可以使用命令安装它们pip install --upgrade google-cloud-logging,设置身份验证后,您将能够运行一个简单的程序,例如我快速开发并在下面分享的程序。

在进入代码本身之前,让我与您分享一些有趣的文档页面,这些页面将帮助您开发自己的代码,以使用这些客户端库以编程方式检索日志条目:

  • 首先,有一般的Stackdriver Logging Python 客户端库文档。您将在这里找到所有类型的信息:检索、写入和删除日志、导出日志等。
    • 具体来说,您将对如何检索日志条目、从单个或多个项目中列出它们以及如何应用高级过滤器感兴趣。
  • 还可以查看条目类是如何定义的,以便访问您感兴趣的字段(在我的示例中,我只检查时间戳严重性字段)。
  • 一组可能也有用的示例。

现在您已经拥有了所需的所有数据,让我们开始一些简单的编码:

# Import the Google Cloud Python client library
from google.cloud import logging
from google.cloud.logging import DESCENDING

# Instantiate a client
logging_client = logging.Client(project = "<YOUR_PROJECT_ID>")

# Set the filter to apply to the logs
FILTER = 'resource.type:gae_app and resource.labels.module_id:default and severity>=WARNING'

i = 0 
# List the entries in DESCENDING order and applying the FILTER
for entry in logging_client.list_entries(order_by=DESCENDING, filter_=FILTER):  # API call
    print('{} - Severity: {}'.format(entry.timestamp, entry.severity))
    if (i >= 5):
        break
    i += 1

这个小片段导入客户端库,在您的项目中实例化一个客户端(项目 ID 等于YOUR_PROJECT_ID),设置一个过滤器,只查找严重性高于WARNING的日志条目,最后列出与过滤器匹配的 6 个最新日志.

运行此代码的结果如下:

my-console:python/logs$ python example_log.py
2018-01-25 09:57:51.524603+00:00 - Severity: ERROR
2018-01-25 09:57:44.696807+00:00 - Severity: WARNING
2018-01-25 09:57:44.661957+00:00 - Severity: ERROR
2018-01-25 09:57:37.948483+00:00 - Severity: WARNING
2018-01-25 09:57:19.632910+00:00 - Severity: ERROR
2018-01-25 09:54:39.334199+00:00 - Severity: ERROR

哪些条目与我建立的过滤器匹配的日志完全对应(请注意,它们在此屏幕截图中以相反的顺序显示):

在此处输入图像描述

我希望这一小段代码(随附我共享的所有文档页面)对您使用 Stackdriver Client Libraries for Python 以编程方式检索日志有用。


正如@otto.poellath 所指出的,列出项目中所有可用的日志名称也可能很有趣。但是,目前没有可用于此目的的 Python 客户端库方法,因此我们必须使用旧的Python API 客户端库(与 Python 客户端库不同)。它可以使用命令安装pip install --upgrade google-api-python-client,并且更容易使用 REST API(正如您在问题中分享的那样,它确实包括列出日志名称的方法) 通过为 Python 提供一个库。使用它不像使用新的客户端库那么容易,但它实现了所有(或几乎所有)可通过 REST API 本身获得的方法。下面我分享另一个代码片段,其中列出了您项目中任何书面日志的所有日志名称:

from apiclient.discovery import build
from oauth2client.client import GoogleCredentials
import json

credentials = GoogleCredentials.get_application_default()
service = build('logging', 'v2', credentials=credentials)

# Methods available in: https://developers.google.com/resources/api-libraries/documentation/logging/v2/python/latest/index.html
collection = service.logs()

# Build the request and execute it
request = collection.list(parent='projects/<YOUR_PROJECT_ID>')
res = request.execute()

print(json.dumps(res, sort_keys=True, indent=4))

它打印如下结果:

my-console:python/logs$ python list_logs.py
{
    "logNames": [
        "projects/<YOUR_PROJECT_ID>/logs/my-log",
        "projects/<YOUR_PROJECT_ID>/logs/my-test-log",
        "projects/<YOUR_PROJECT_ID>/logs/python",
        "projects/<YOUR_PROJECT_ID>/logs/requests"
    ]
}

我知道这不是您在问题中所问的,因为它没有专门使用 Python 客户端库,但我认为这对您来说可能也很有趣,因为知道此功能在新的客户端库中不可用,结果类似,因为您可以使用 Python 以编程方式访问日志名称列表。

于 2018-01-29T15:01:19.640 回答
0
from google.cloud import logging

# Instantiate a client
logging_client = logging.Client(project="projectID")

# Set the filter to apply to the logs
FILTER = 'resource.labels.function_name="func_name" severity="DEBUG"'

for entry in logging_client.list_entries(filter_=FILTER):  # API call
    print(entry.severity, entry.timestamp, entry.payload)

这是关于云功能的!

于 2021-01-27T08:48:50.440 回答