我有一个节点mongo app。现在,我想显示应用程序中发生的一些特定crud事件的审计跟踪。
解决这个问题的最佳方法是什么?
我考虑过创建一个新的集合和服务,它将在节点应用程序的每个方法中调用以记录操作。
答案 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
});