如何在MongoDB Node App中启用审计和记录所有CRUD操作?

时间:2016-05-22 17:20:14

标签: node.js mongodb

我有一个节点mongo app。现在,我想显示应用程序中发生的一些特定crud事件的审计跟踪。

解决这个问题的最佳方法是什么?

我考虑过创建一个新的集合和服务,它将在节点应用程序的每个方法中调用以记录操作。

5 个答案:

答案 0 :(得分:3)

您正在谈论'触发'。但不幸的是,#34; MongoDB不支持触发器"。

要解决您的问题,只需创建另一个集合并将日志信息存储到该集合中。

参考:

答案 1 :(得分:1)

如果您使用的是mongoose模块,则可以使用记录所有查询的方法。它将在控制台上记录所有查询。

mongoose.set('debug', true);

如果要登录文件,请使用此方法的回调

mongoose.set('debug', function (coll, method, query, doc [, options]) {
 //do your thing
});

答案 2 :(得分:0)

最好使用具有您要为特定操作存储的所有日志的其他模式。

// 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);

您可以在此处使用

记录活动日志
  

采取了什么行动。   哪个用户。   以及您希望使用该操作存储的消息等。

答案 3 :(得分:0)

您可以向应用添加中间件,为每个请求添加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

答案 4 :(得分:0)

对于较新版本的 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
});