在Firebase Cloud Function中使用Express能否拆分不同端点的日志?
如何区分Express+Cloud Functions中不同端点的日志分组?
我用Node.js结合Google Cloud Functions和Express创建了两个端点,index.ts代码如下:
import {onRequest} from "firebase-functions/v2/https"; import * as express from "express"; const app = express(); app.use("/api/example1", (req, res) => res.send("Hei")); app.use("/api/example2", (req, res) => res.send("yoooo")); exports.app = onRequest(app);
通过Firebase模拟器构建后,得到两个访问端点:
http://127.0.0.1:5000/blueray-cargo/us-central1/app/api/example1 http://127.0.0.1:5000/blueray-cargo/us-central1/app/api/example2
但访问这两个端点时,Cloud Functions日志会把它们归到同一个function[us-central1-app]分组里,想知道能不能让它们生成不同的日志条目,方便出错时区分问题来自哪个端点,有没有可行的解决办法?
解决办法
方案一:拆分为独立的Cloud Function
直接把两个端点做成两个独立的Cloud Function,每个请求会对应各自的日志分组,代码示例:
import {onRequest} from "firebase-functions/v2/https"; // 为example1单独创建函数 exports.example1 = onRequest((req, res) => { res.send("Hei"); }); // 为example2单独创建函数 exports.example2 = onRequest((req, res) => { res.send("yoooo"); });
此时访问端点会变成:
http://127.0.0.1:5000/blueray-cargo/us-central1/example1 http://127.0.0.1:5000/blueray-cargo/us-central1/example2
每个端点的日志会分别归到us-central1-example1和us-central1-example2分组,完全独立区分。
方案二:在Express中添加自定义日志标识
如果不想拆分函数,可以通过中间件给每个路由的请求添加自定义标签或日志字段,让日志能区分端点:
import {onRequest, Logger} from "firebase-functions/v2/https"; import * as express from "express"; const app = express(); // 自定义中间件,给请求添加端点标识并写入日志 app.use((req, res, next) => { const endpoint = req.path; // 用Cloud Functions的Logger添加自定义标签 Logger.log(`Request to endpoint: ${endpoint}`, { labels: { endpoint: endpoint } }); next(); }); app.use("/api/example1", (req, res) => res.send("Hei")); app.use("/api/example2", (req, res) => res.send("yoooo")); exports.app = onRequest(app);
这样在日志里可以通过endpoint标签筛选不同端点的请求,出错时也能快速定位来源。也可以在错误处理中间件里带上端点信息,确保错误日志也能区分。
方案三:给onRequest添加路由级别的标签配置
利用Cloud Functions v2的onRequest配置选项,给不同路由单独设置标签,需要把路由拆分开处理:
import {onRequest} from "firebase-functions/v2/https"; import * as express from "express"; const app = express(); // 为example1路由单独配置标签 app.use("/api/example1", onRequest({ labels: {endpoint: "example1"} }, (req, res) => res.send("Hei"))); // 为example2路由单独配置标签 app.use("/api/example2", onRequest({ labels: {endpoint: "example2"} }, (req, res) => res.send("yoooo"))); exports.app = onRequest(app);
这种方式能让每个路由的请求日志带上专属标签,在Cloud Functions日志控制台可以通过标签筛选不同端点的日志条目。
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

