来自firebase函数的自定义日志记录



我试图按照本指南将一些自定义日志记录放入firebase函数中。函数本身正在运行,我可以看到传入的数据(这是一个https"可调用"函数(。但一旦它到达它试图实际写入日志条目的行,我就会得到";错误:7 PERMISSION_DENIED";

由于console.log()调用对云日志的写入,我假设firebase函数可以访问云日志。但也许它需要额外的许可?不过,我在那个页面上找不到任何应该设置的参考。

// Logging, logName, region, functions are provided by the surrounding app
const logging = new Logging()
const log = logging.log(logName)
const METADATA = {
resource: {
type: 'cloud_function',
labels: {
function_name: 'CustomLog',
region
}
}
};
exports = module.exports = functions.https.onCall(async data => {
const exVersion = 6
const exId = data.exId
console.log('***** exVersion:', exVersion, 'exId:', exId)  // exId from caller

const entry = log.entry(METADATA, data.error)  // data.error from caller
console.log('METADATA:', METADATA)  // Shows in Logs Explorer
console.log('entry:', entry)  // Shows in Logs Explorer
log.write(entry)  // Results in Error: 7 PERMISSION_DENIED
return {
exVersion,
exId,
}
})

如果我使用firebase function:shell从CLI运行它,则会正确创建日志条目,因此我非常确信代码是正确的。

好吧,我终于找到了它。根据这个答案,firebase函数使用的服务帐户是{project-id}@appspot.gserviceaccount.com,在我的项目中,该帐户不具有"日志写入器"角色。添加该角色可以解决问题。

我觉得奇怪的是,firebase函数不需要这个角色来使用console.log()记录消息,但可能该调用被函数环境截获,并且日志被写为不同的服务帐户。它还解释了为什么本地运行的函数能够写入日志,因为它们使用具有完全访问权限的"所有者"服务帐户运行。

根据您链接的Firebase文档页面:

从函数进行日志记录的建议解决方案是使用logger SDK。您可以使用标准的JavaScript日志记录调用,例如作为console.log和console.error,但您首先需要修补标准方法以正确工作的特殊模块:

require("firebase-functions/lib/logger/compat");

一旦您需要记录器兼容性模块,就可以在代码中正常使用console.log((方法。

因此,您可能需要此库,但我不确定这是否会导致"Error: 7 PERMISSION_DENIED错误,但您也可以尝试一些适用于社区某些成员的解决方案。

也许您的项目中没有启用日志API。在这种情况下,尝试使用它时会出现拒绝权限错误。

它有几个级别,但你链接的指南指向https://github.com/googleapis/nodejs-logging#before-你开始,这包括一个步骤";启用云日志API";

相关内容

  • 没有找到相关文章

最新更新