簡體   English   中英

如何從 StackDriver Logging API 反序列化 App Engine 應用程序日志?

[英]How to deserialize App Engine application logs from StackDriver Logging API?

作為遷移到 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..."
}

這讓我在proto_payload.value字段中獲得了一個帶有文本應用程序日志的LogEntry 如何反序列化該字段? 我在文檔中發現了很多相關的提及,但沒有任何東西指向我的google.appengine.logging.v1.RequestLog protobuf 生成的 class 任何我可以使用的地方,如果這是正確的想法的話。 有人做過嗎?

嗚。 終於得到了這個工作。 我必須自己手動為google.appengine.logging.v1.RequestLog協議緩沖區生成和使用 Python 綁定。 就是這樣。

首先,我首先克隆了這兩個存儲庫:

然后,我通過運行從request_log.proto生成request_log_pb2.py

protoc -I googleapis/ -I protobuf/src/ --python_out . googleapis/google/appengine/logging/v1/request_log.proto

最后,我 pip 安裝了googleapis-common-protosprotobuf 然后我能夠反序列proto_payload

from google.cloud.logging_v2 import LoggingServiceV2Client
client = LoggingServiceV2Client(...)
log = next(iter(client.list_log_entries(('projects/brid-gy',),
   filter_='logName="projects/brid-gy/logs/appengine.googleapis.com%2Frequest_log"')))

import request_log_pb2
pb = request_log_pb2.RequestLog.FromString(log.proto_payload.value)
print(pb)

您可以使用LogEntry.to_api_repr() function 來獲取LogEntry的 JSON 版本。

>>> 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'}

您真的要使用 API v2 嗎?

如果沒有,請使用from google.cloud import logging並設置os.environ['GOOGLE_CLOUD_DISABLE_GRPC'] = 'true' - 或類似的 env 設置。

這將有效地返回payload中的 JSON 而不是payload_pb

您可以嘗試使用: - gcloud beta logging read ${LOG_FILTER}

或者

您可以更改編寫 python 腳本的方法。 您可以使用 python進程模塊來調用 gcloud 命令(請記住,這是 beta 命令組的一部分,它可以在沒有警告的情況下更改更新。將 output 發送到字符串中,然后以這種方式解析條目。這個,雖然這意味着您將在 python 環境中擁有您的日志(具有所有帶來的影響力),但是它不會使用 google.cloud 庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM