【问题标题】:Retrieve list of log names from Google Cloud Stackdriver API with Python使用 Python 从 Google Cloud Stackdriver API 检索日志名称列表
【发布时间】:2018-01-27 09:23:48
【问题描述】:

我使用谷歌的Stackdriver Logging Client Libraries for Python 以编程方式retrieve log entries,类似于使用gcloud beta logging read

Stackdriver 还为 retrieve a list of log names 提供了一个 API,这很可能是 gcloud beta logging logs list 使用的。

如何将该 API 与 Python 客户端库一起使用?我在docs 中找不到任何内容。

【问题讨论】:

    标签: python google-cloud-platform google-cloud-python google-cloud-stackdriver


    【解决方案1】:

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

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

    • 首先,有一般的Stackdriver Logging Python Client Library 文档。您将在这里找到所有类型的信息:检索、写入和删除日志、导出日志等。
      • 详细来说,您将对如何retrieve log entries、从单个或多个项目中列出它们以及应用高级过滤器感兴趣。
    • 还请查看entry class 是如何定义的,以便访问您感兴趣的字段(在我的示例中,我只检查 timestampseverity 个字段)。
    • set of examples 也可能有用。

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

    # 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
    

    这个小 sn-p 导入客户端库,在您的项目中实例化一个客户端(项目 ID 等于 YOUR_PROJECT_ID),设置一个过滤器,只查找严重性高于 的日志条目em>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 Client Library(与 Python 客户端库不同)。它可以使用命令pip install --upgrade google-api-python-client 安装,并且通过为Python 提供一个库,可以更轻松地使用REST API(正如您在问题中分享的那样确实包括a method to list log names)。使用它不像使用新的客户端库那么容易,但它实现了所有(或几乎所有)可通过 REST API 本身获得的方法。下面我分享另一个代码 sn-p,它列出了您项目中任何书面日志的所有日志名称:

    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 以编程方式访问日志名称列表。

    【讨论】:

    • 感谢您的回答!但正如我在问题中所写,检索日志条目工作得很好。我要问的是如何使用 python 库来检索日志列表,就像 'gcloud logging logs list` 所做的那样。
    • 抱歉,我没听懂你的问题,让我看看,以防找到你需要的信息。
    • 我已经编辑了我的问题,添加了一种解决方法来查找您需要的日志名称列表。它不完全使用 Python 客户端库(因为您需要的方法在这些库中不可用),但它是使用 Python 以编程方式检索列表的好方法。我希望它有所帮助。
    【解决方案2】:
    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)
    

    这是关于云功能的!

    【讨论】:

      猜你喜欢
      • 2020-03-16
      • 2019-12-29
      • 2023-03-12
      • 1970-01-01
      • 2015-10-07
      • 2019-02-21
      • 1970-01-01
      • 2019-12-08
      • 1970-01-01
      相关资源
      最近更新 更多