Получить список имен журналов из Google Cloud Stackdriver API с Python

Я использую клиентские библиотеки журналов Stackdriver для Python для программного получения записей журнала, аналогично использованию gcloud beta logging read.

Stackdriver также предоставляет API для получения списка имена журналов, которые, скорее всего, используются gcloud beta logging logs list.

Как я могу использовать этот API с клиентскими библиотеками Python? Я ничего не нашел в документах.


person otto.poellath    schedule 18.08.2017    source источник


Ответы (2)


Вы можете работать с клиентскими библиотеками Stackdriver Logging для Python. Вы можете установить их с помощью команды pip install --upgrade google-cloud-logging, а после настройки аутентификации вы сможете запускать простую программу, такую ​​как та, которую я быстро разработал и которой делюсь ниже.

Прежде чем перейти к самому коду, позвольте мне поделиться с вами некоторыми интересными страницами документации, которые помогут вам разработать собственный код для программного извлечения записей журнала с использованием этих клиентских библиотек:

  • First, there is the general Stackdriver Logging Python Client Library documentation. You will find all kind of information here: retrieving, writing and deleting logs, exporting logs, etc.
    • In detail, you will be interested in how to retrieve log entries, listing them from a single or multiple projects, and also applying advanced filters.
  • Также посмотрите, как определяется класс записи. , чтобы получить доступ к интересующим вас полям (в моем примере я проверяю только поля timestamp и severity).
  • набор примеров, которые также могут быть полезны. .

Теперь, когда у вас есть все необходимые данные, давайте приступим к простому кодированию:

# 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

Этот небольшой фрагмент импортирует клиентские библиотеки, создает экземпляр клиента в вашем проекте (с идентификатором проекта, равным 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 для 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.

person dsesto    schedule 29.01.2018
comment
Спасибо за Ваш ответ! Но, как я написал в своем вопросе, получение записей журнала работает нормально. Я спрашиваю, как использовать библиотеки python для получения списка журналов, как это делает «список журналов журналов gcloud». - person otto.poellath; 29.01.2018
comment
Извините, я неправильно понял ваш вопрос, позвольте мне посмотреть, если я найду необходимую вам информацию. - person dsesto; 29.01.2018
comment
Я отредактировал свой вопрос, добавив обходной путь, чтобы найти список имен журналов, который вам нужен. Он не совсем использует клиентские библиотеки Python (поскольку требуемый метод недоступен в этих библиотеках), но это хороший способ получить список программно с помощью Python. Я надеюсь, что это помогает. - person dsesto; 29.01.2018

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)

Это в отношении Облачной функции!

person LearnerJS    schedule 27.01.2021