从 Google Logging API 解码 protoPayload

Posted

技术标签:

【中文标题】从 Google Logging API 解码 protoPayload【英文标题】:Decoding protoPayload from Google Logging API 【发布时间】:2018-11-28 19:43:13 【问题描述】:

我想阅读 BigQuery 日志条目以进行一些分析。但我似乎无法解码protoPayload.value。我试过搞乱google-proto-filesprotocol-buffers 包,但我认为我在这里遗漏了一些非常明显的东西......

const Logging = require('@google-cloud/logging');
const protobuf = require('protocol-buffers');
const protoFiles = require('google-proto-files');


const protoPath = './node_modules/google-proto-files/google/cloud/audit/audit_log.proto';
const root = protoFiles.loadSync(protoPath)
const AuditLog = root.lookup('google.cloud.audit.AuditLog');

const client = new Logging.v2.LoggingServiceV2Client( projectId );
client.listLogEntriesStream(resourceNames, filter, pageSize)
    .on('data', entry => 
        console.log(entry); // Entry is of type AuditLog
        console.log(AuditLog.decode(entry.protoPayload.value.buffer));
        process.exit(1)
    )
    .on('error', e => console.error(e))
    .on('end', () => console.info('END RECEIVED', arguments))

我确实收到了带有 protoPayloads 的消息,但是我在尝试解码消息时收到的错误是这样的:

Error: no such Type or Enum 'google.rpc.Status' in Type .google.cloud.audit.AuditLog

实际问题:解码LogEntry 中的protoPayload 字段的正确方法是什么?

谢谢!

【问题讨论】:

【参考方案1】:

由于 entry.protoPayload.value 是一个序列化的原型(一个 AuditLog 消息),您应该能够使用 https://developers.google.com/protocol-buffers/docs/reference/javascript-generated#message 中记录的 deserializeBinary() 方法处理它,“protocol-buffers”npm 似乎不是来自 Google , 并且 proto 编译器将生成反序列化代码。

我不认为您需要这样做,但您也可以尝试显式加载“google/rpc/status.proto”定义。

【讨论】:

以上是关于从 Google Logging API 解码 protoPayload的主要内容,如果未能解决你的问题,请参考以下文章

如何从 AngularJS 应用程序登录到 Google Cloud Logging?

从 Google 解码 JWT 字符串失败 [php]

使用 Python 进行 base64 解码,并使用基于 REST 的 Gmail API 下载附件

从断言中解码 JWT - Google 登录

用 php 提取 Instagram 信息——解码然后呢?

如何从 Google Cloud 获取 p12 文件(key.p12)?