【问题标题】:cappedMax not working in winston-mongodb logger in Node.js on UbuntucappedMax 在 Ubuntu 上的 Node.js 中的 winston-mongodb 记录器中不起作用
【发布时间】:2016-04-03 09:14:39
【问题描述】:

我使用 winston 模块在 Node.js 中创建了一个记录器,并通过要求带有以下选项的 winston-mongodb 模块添加了 MongoDB 传输:

{
  db: config.db[k.DB_ENV.AUTHOR],
  username: config.dbUser,
  password: config.dbPassword,
  collection: 'log-aggregation',
  storeHost: true,
  capped: true,
  cappedMax: 10 // documents
}

我希望记录器为每 10 个文档创建一个新集合。但是记录器继续记录 same 集合。我评论了collection: 'log-aggregation' 行以检查选项是否真的有效,然后它开始登录到默认的'log' 集合。

那么我的错误在哪里? cappedMax 选项是否有最小文档大小?我尝试使用 cappedSize 选项也使用 10 到 1000 个值,但仍然没有创建新集合。

我想知道 cappedSize 和 cappedMax 选项的最小和最大允许值?

我还想知道创建的新集合的名称是什么?

【问题讨论】:

  • 关于集合名称,请在此处指定 --> collection: 'log-aggregation'。对于cappedSize,我不确定为什么它会一直存储超过指定大小,但也许你可以尝试cappedSize 并添加一个以字节为单位的数字
  • @securecurve 我尝试了以字节为单位的 cappedSize 和 cappedMax ..仍然没有创建新的集合
  • 据我了解,capped 只是创建一个有上限的 MongoDB 集合 (docs.mongodb.com/manual/core/capped-collections),其工作方式类似于循环缓冲区。如果前一个集合“已满”,则不会创建新集合。

标签: javascript node.js mongodb logging winston


【解决方案1】:

我遇到了同样的问题,但我通过简单地更新 winston-mongodb 版本来解决它 npm i winston-mongodb

【讨论】:

    【解决方案2】:

    所以只是为了确认 winston-mongodb 的“上限”功能是:

    
    capped:       // true or false
    cappedMax:    // [int] number of documents per collection
    cappedSize:    // [byte-size] Size of documents capped per collection in bytes
    
    

    正在工作,但重要的是要注意,为了使其工作,您不能使用这些属性修改现有集合。假设您从头开始。例如,如果您已经创建了您的收藏,现在希望向其中添加上限功能,那么这将不起作用!

    您需要将集合完全转储到数据库中并从头开始,或者只创建一个新集合。

    例如,这是从我的传输数组中提取的代码。

    new transports.MongoDB({
              level: 'error',
              db: process.env.MONGO_CONNECTION_LOG_STRING,
              options: { useUnifiedTopology: true },
              format: combine(timestamp(), json()),
              collection: 'prod_log',
              capped: true,
              cappedMax: 2
            })
    

    所以目前我确保这个集合在我的数据库中不存在,这个配置将只允许在任何时候将 2 个文档存储在我的集合中,并且任何未来的错误都会覆盖任何现有的,所以你只会在集合中拥有最后两个“错误”日志/文档。

    一直在玩这个,希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      这是我用来获取多个日志的:

      var winston = require('winston');
      require('winston-mongodb').MongoDB;
      
      
      winston.loggers.add('userLog',{
          transports : [
              new(winston.transports.MongoDB)({
                  db : 'mongodb://username:password.mongolab.com:5555/log_db',
                  collection : 'userLog',
                  capped : true
              }),
          ]
      });
      winston.loggers.add('profileLog',{
          transports : [
              new(winston.transports.MongoDB)({
                  db : 'mongodb://username:password.mongolab.com:5555/log_db',                collection : 'profileLog',
                  capped : true
              }),
          ]
      });
      

      而且它运行良好,没有可观察到的延迟。

      附:你可以在capped:true之后或之前添加你想要的所有选项

      玩得开心!

      【讨论】:

        猜你喜欢
        • 2018-05-19
        • 2021-07-20
        • 2015-10-07
        • 1970-01-01
        • 2015-03-10
        • 2015-04-15
        • 1970-01-01
        • 2014-07-03
        • 2018-06-20
        相关资源
        最近更新 更多