在Firebase云功能中记录'jsonPayload'

时间:2018-03-09 02:45:51

标签: firebase google-cloud-functions stackdriver

TL; DR;

有没有人知道是否可以在Firebase / Google Cloud功能中使用console.log使用jsonPayload属性将条目记录到堆栈驱动程序,以便我的日志可搜索(目前我传递给控制台的任何内容)。 log被字符串化为textPayload)。

我有一个多模块项目,其中一些代码在Firebase云功能上运行,还有一些在其他环境中运行,如Google Compute Engine。稍微简化一下,我基本上有一个“核心”模块,然后我将'云功能'模块部署到云功能,'后端服务'部署到GCE,这些都依赖于'核心'等。

我正在使用bunyan在我的'核心'模块中进行日志记录,当部署到GCE时,使用'@ google-cloud / logging-bunyan'配置记录器,以便我的日志转到堆栈驱动程序。

除此之外:在Google Cloud Functions中使用此配置会导致Error: Endpoint read failed出现问题,我认为这是由于功能不会冷却并尝试重复使用死连接,但我不是100%肯定是什么真正的原因是。

所以现在我正在尝试使用console.log(arg)进行日志记录,其中arg是一个对象,而不是字符串。我希望这个对象出现在jsonPayload下的堆栈驱动程序中,但它正在被字符串化并放入textPayload字段。

2 个答案:

答案 0 :(得分:7)

我花了一段时间,但我终于在this example遇到了firebase functions samples repository。最后我决定采取类似这样的事情:

const Logging = require('@google-cloud/logging');
const logging = new Logging();
const log = logging.log('my-func-logger');
const logMetadata = {
  resource: {
    type: 'cloud_function',
    labels: {
      function_name: process.env.FUNCTION_NAME ,
      project: process.env.GCLOUD_PROJECT,
      region: process.env.FUNCTION_REGION
    },
  },
};
const logData = { id: 1, score: 100 };
const entry = log.entry(logMetaData, logData);
log.write(entry)

您可以将字符串severity属性值添加到logMetaData(例如“INFO”或“ERROR”)。 Here is the list可能的值。

答案 1 :(得分:0)

我遇到了同样的问题,正如对@wtk答案的评论所指出的那样,我想添加复制所有我可以在下面的代码段中找到的默认云函数日志记录行为的副本,包括execution_id。

至少对于将Cloud FunctionsHTTP Trigger选项一起使用,以下内容为我生成了正确的日志。我尚未测试Firebase Cloud Functions

// global
const { Logging } = require("@google-cloud/logging");
const logging = new Logging();
const Log = logging.log("cloudfunctions.googleapis.com%2Fcloud-functions");
const LogMetadata = {
  severity: "INFO",
  type: "cloud_function",
  labels: {
    function_name: process.env.FUNCTION_NAME,
    project: process.env.GCLOUD_PROJECT,
    region: process.env.FUNCTION_REGION
  }
};

// per request
const data = { foo: "bar" };
const traceId = req.get("x-cloud-trace-context").split("/")[0];
const metadata = {
  ...LogMetadata,
  severity: 'INFO',
  trace: `projects/${process.env.GCLOUD_PROJECT}/traces/${traceId}`,
  labels: {
    execution_id: req.get("function-execution-id")
  }
};
Log.write(Log.entry(metadata, data));