【问题标题】:How to enable auditing and log all CRUD operations in MongoDB Node App?如何在 MongoDB Node App 中启用审计和记录所有 CRUD 操作?
【发布时间】:2021-02-11 04:15:06
【问题描述】:

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

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

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

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    最好使用不同的架构,其中包含您要为特定操作存储的所有日志。

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

    您可以在此处记录您的活动日志

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

    【讨论】:

      【解决方案2】:

      您在谈论“触发”。但遗憾的是“MongoDB 不支持触​​发器”。

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

      参考:

      【讨论】:

        【解决方案3】:

        如果您使用的是猫鼬模块,那么有记录所有查询的方法。它将在控制台上记录所有查询。

        mongoose.set('debug', true);
        

        如果你想登录一个文件,那么这个方法使用回调

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2018-07-18
              • 1970-01-01
              • 2014-12-12
              • 2018-06-14
              • 1970-01-01
              • 1970-01-01
              • 2014-12-07
              • 2020-08-01
              • 2019-07-03
              相关资源
              最近更新 更多