TL; DR;
有没有人知道是否可以在Firebase / Google Cloud功能中使用console.log
使用jsonPayload
属性将条目记录到堆栈驱动程序,以便我的日志可搜索(目前我传递给console.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
下的Stack Driver中,但是它被字符串化并放入textPayload
字段。
我花了一段时间,但我终于在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的可能值。
我遇到了同样的问题,正如关于@ wtk的回答的评论所述,我想添加复制我在下面的代码片段中找到的所有默认云函数日志记录行为,包括execution_id。
至少对于使用Cloud Functions
和HTTP 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));