Как десериализовать журналы приложений App Engine из API ведения журнала StackDriver? - PullRequest
1 голос
/ 07 ноября 2019

В рамках перехода на Python 3 мне нужно перейти с logservice на StackDriver Logging API . У меня установлено google-cloud-logging , и я могу успешно получать журналы приложений GAE, например:

>>> from google.cloud.logging_v2 import LoggingServiceV2Client
>>> entries = LoggingServiceV2Client().list_log_entries(('projects/projectname',),
         filter_='resource.type="gae_app" AND protoPayload.@type="type.googleapis.com/google.appengine.logging.v1.RequestLog"')
>>> print(next(iter(entries)))
proto_payload {
  type_url: "type.googleapis.com/google.appengine.logging.v1.RequestLog"
  value: "\n\ts~brid-gy\022\0018\032R5d..."
}

Это дает мне LogEntry с текстовыми журналами приложений в proto_payload.value поле. Как я могу десериализовать это поле? Я нашел много связанных упоминаний в документах, но ничто не указывало мне на сгенерированный google.appengine.logging.v1.RequestLog класс protobuf где-нибудь, что я мог бы использовать, если это даже правильная идея. Кто-нибудь делал это?

1 Ответ

0 голосов
/ 07 ноября 2019

Вы можете использовать функцию LogEntry.to_api_repr(), чтобы получить JSON-версию LogEntry.

>>> from google.cloud.logging import Client
>>> entries = Client().list_entries(filter_="severity:DEBUG")        
>>> entry = next(iter(entries))
>>> entry.to_api_repr()
{'logName': 'projects/PROJECT_NAME/logs/cloudfunctions.googleapis.com%2Fcloud-functions'
, 'resource': {'type': 'cloud_function', 'labels': {'region': 'us-central1', 'function_name': 'tes
t', 'project_id': 'PROJECT_NAME'}}, 'labels': {'execution_id': '1zqolde6afmx'}, 'insertI
d': '000000-f629ab40-aeca-4802-a678-d513e605608e', 'severity': 'DEBUG', 'timestamp': '2019-10-24T2
1:55:14.135056Z', 'trace': 'projects/PROJECT_NAME/traces/9c5201c3061d91c2b624abb950838b4
0', 'textPayload': 'Function execution started'}
.
...