【发布时间】:2021-02-11 04:15:06
【问题描述】:
我有一个 node mongo 应用程序。现在我想显示应用程序中发生的一些特定 crud 事件的审计跟踪。
解决这个问题的最佳方法是什么?
我已经考虑创建一个新的集合和服务,它将在节点应用程序的每个方法中调用以记录操作。
【问题讨论】:
我有一个 node mongo 应用程序。现在我想显示应用程序中发生的一些特定 crud 事件的审计跟踪。
解决这个问题的最佳方法是什么?
我已经考虑创建一个新的集合和服务,它将在节点应用程序的每个方法中调用以记录操作。
【问题讨论】:
最好使用不同的架构,其中包含您要为特定操作存储的所有日志。
// schema
var schema = new Schema({
actionType: {type: String, require: true},
userId: { type: Schema.Types.ObjectId, required: true },
userType: { type: String, required: true },
message: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
}, options);
您可以在此处记录您的活动日志
采取了什么行动。 哪个用户。 以及您要使用该操作存储的消息等。
【讨论】:
您在谈论“触发”。但遗憾的是“MongoDB 不支持触发器”。
为了解决您的问题,只需创建另一个集合并将日志信息存储到该集合中。
参考:
【讨论】:
如果您使用的是猫鼬模块,那么有记录所有查询的方法。它将在控制台上记录所有查询。
mongoose.set('debug', true);
如果你想登录一个文件,那么这个方法使用回调
mongoose.set('debug', function (coll, method, query, doc [, options]) {
//do your thing
});
【讨论】:
您可以向您的应用添加一个中间件,该中间件为每个请求添加一个 bunyan 子记录器,并带有一些唯一 ID(可能是 uuid)
这里是一些示例代码,用于将记录器附加到具有唯一 ID 的每个请求, 每当您使用此记录器打印某些内容时,此 uuid 也会自动打印,因此您可以使用此 id 跟踪每个请求
var bunyan = require('bunyan');
var uuid = require('uuid');
var logger = bunyan.createLogger({name: 'some name'});
function loadlogger(req, res, next) {
req.log = logger.child({request_id: uuid.v4()});
next()
}
app.use(loadLogger);
您可以随时登录
req.log.info({keys: values}, "message");
req.log.warn({keys: values}, "message");
req.log.error({keys: values}, "message");
您可以参考完整文档bunyan logger
【讨论】:
对于较新版本的 mongodb (>=3.6),您可以使用 mongodbs 更改流。 https://docs.mongodb.com/manual/changeStreams/
基于此,您可以跟踪所需的更改,并可以将它们单独保存在文件或集合中。
这是一个简单的例子:
const collection = db.collection('users');
const changeStream = collection.watch();
changeStream.on('change', next => {
// do your stuff
});
【讨论】: