如何从 StackDriver Logging API 反序列化 App Engine 应用程序日志?
How to deserialize App Engine application logs from StackDriver Logging API?
作为迁移到 Python 3 的一部分,我需要从安装的 logservice to the StackDriver Logging API. I have 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-gy2[=11=]182R5d..."
}
这让我得到一个 LogEntry
,在 proto_payload.value
字段中有文本应用程序日志。我如何反序列化该字段?我在文档中发现了很多相关的提及,但没有任何内容指向 google.appengine.logging.v1.RequestLog
protobuf generated class 我可以在任何地方使用,如果这是正确的想法的话。有人做过吗?
您可以使用 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'}
哇!终于让这个工作了。我必须自己手动为 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-protos
和 protobuf
。然后我能够反序列化 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)
您真的要使用 API v2 吗?
如果没有,使用 from google.cloud import logging
和
设置 os.environ['GOOGLE_CLOUD_DISABLE_GRPC'] = 'true'
- 或类似的环境设置。
这将有效地 return payload
中的 JSON 而不是 payload_pb
作为迁移到 Python 3 的一部分,我需要从安装的 logservice to the StackDriver Logging API. I have 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-gy2[=11=]182R5d..."
}
这让我得到一个 LogEntry
,在 proto_payload.value
字段中有文本应用程序日志。我如何反序列化该字段?我在文档中发现了很多相关的提及,但没有任何内容指向 google.appengine.logging.v1.RequestLog
protobuf generated class 我可以在任何地方使用,如果这是正确的想法的话。有人做过吗?
您可以使用 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'}
哇!终于让这个工作了。我必须自己手动为 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-protos
和 protobuf
。然后我能够反序列化 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)
您真的要使用 API v2 吗?
如果没有,使用 from google.cloud import logging
和
设置 os.environ['GOOGLE_CLOUD_DISABLE_GRPC'] = 'true'
- 或类似的环境设置。
这将有效地 return payload
中的 JSON 而不是 payload_pb