如何定位Firebase数据库中读写操作及意外读取的来源?
排查Firebase数据库意外读取量的方法
1. 利用Firebase控制台的Usage统计
- 打开Firebase控制台,进入目标项目后选择对应数据库(Cloud Firestore/Realtime Database)
- 切换到Usage标签页,这里会按集合/文档节点层级展示读写数据量,通过筛选时间范围,能快速定位读取量异常的资源路径
- 注意:Realtime Database按节点层级统计,Firestore则细分到集合和具体文档路径
2. 启用Cloud Logging审计日志(Firestore专属)
- 进入Google Cloud控制台的Cloud Logging模块,定位到你的Firebase项目
- 使用以下查询语句过滤Firestore读取操作日志:
resource.type="firestore_database" AND logName="projects/[你的项目ID]/logs/firestore.googleapis.com%2Fdatastore.googleapis.com%2Faudit_logs" AND (protoPayload.methodName:"google.firestore.v1.Firestore.GetDocument" OR protoPayload.methodName:"google.firestore.v1.Firestore.ListDocuments") - 日志中会包含完整的文档路径、请求来源(客户端SDK、Cloud Functions等)以及请求时间,精准定位读取操作的触发源
3. 客户端开启调试日志
- 如果怀疑读取来自客户端应用,可在开发环境中启用Firebase调试日志:
- Web端:初始化Firebase后添加代码
firebase.firestore.setLogLevel('debug') - Android:通过Logcat查看Firebase调试输出;iOS:在Xcode控制台查看相关日志
- Web端:初始化Firebase后添加代码
- 调试日志会输出每一次读取请求的完整资源路径,直接对应异常读取的触发位置
4. 用Cloud Functions自定义监控
- 编写Cloud Function监听Firestore读取审计事件,记录详细读取信息:
const functions = require('firebase-functions'); const { Logging } = require('@google-cloud/logging'); const logging = new Logging({ projectId: process.env.GCLOUD_PROJECT }); exports.trackFirestoreReads = functions.auditLog.document().onWrite((event) => { const readMethods = ['google.firestore.v1.Firestore.GetDocument', 'google.firestore.v1.Firestore.ListDocuments']; if (readMethods.includes(event.auditLog.methodName)) { const log = logging.log('custom-firestore-reads'); const metadata = { resource: { type: 'firestore_database' } }; const entry = log.entry(metadata, { documentPath: event.resource.name, triggerTime: event.auditLog.timestamp, caller: event.auditLog.authenticationInfo?.principalEmail || 'unauthenticated' }); return log.write(entry); } return null; }); - 部署函数后,在Cloud Logging中查看
custom-firestore-reads日志,获取读取路径和调用方的详细信息
内容的提问来源于stack exchange,提问作者deem
相关产品推荐
相关产品推荐

