如何在Mongoid中获取调试map/reduce的打印输出?

Wol*_*old 6 mapreduce mongodb mongoid mongoid3

我正在使用Mongoid 3.0编写map/reduce操作.我正在尝试使用该print语句来调试JS函数.这是来自MongoDB文档疑难解答建议,例如:

reduce = %Q{
   function(user_id, timestamps) {
      var max = 0;
      timestamps.forEach(function(t) {
        var diff = t.started_at - t.attempted_at;
        if (diff > max) { max = diff; }
      });
      print(user_id + ', ' + max);
      return max;
    };
  }

 MyCollection.all.map_reduce(map, reduce).to_a
Run Code Online (Sandbox Code Playgroud)

不幸的是,print语句的输出既没有显示在控制台上也没有显示在日志上 - 似乎在DB,驱动程序,Moped或任何中间层之间的某处被抑制.有没有办法打开它?

Wol*_*old 13

事实证明,print语句日志是MongoDB服务器日志.在OSX上,就是这样/usr/local/var/log/mongodb/mongo.log

  • 这对我来说是`tail -f/usr/local/var/log/mongodb/output.log` (7认同)
  • 将它与管道和grep相结合帮助我滤除了噪音!谢谢!$ tail -f /usr/local/var/log/mongodb/mongo.log | grep'mystuff' (2认同)

Sim*_*Sim 11

根据海报的评论,第一步是确保您正在查看mongod服务器日志.在本地执行此操作的最简单方法是访问鲜为人知的HTTP接口mongod:http://localhost:28017.即使服务器未安装在其默认位置,这也将起作用,因此,日志将不在默认的OS特定位置,例如,/usr/local/var/log/mongodb/mongo.log在Mac OS X上.请参阅文档以了解如何以非标准方式访问此服务器部署环境.

如果这不能解决您的问题,您将不得不深入调试MongoDB M/R,这有点棘手,原因如下:

  1. M/R作业在与JS的其余部分隔离的JS作用域中执行
  2. M/R作业无法写入M/R输出文档以外的任何内容
  3. MongoDB中的记录器可以自行决定将哪些内容发送到日志记录流

以下是基于我们在生产中广泛使用Mongo M/R的建议:

提高日志记录级别

突然之间,一些以前看不见的print输出会出现.一次做一级,直到你开始看到它.

use admin
db.runCommand( { setParameter: 1, logLevel: 2 } )
Run Code Online (Sandbox Code Playgroud)

日志级别从0到5不等.请参阅setParameter.您也可以在服务器启动时使用-v,-vv,..., - vvvvv执行此操作.

将分析级别增加到max(2)

我发现这很有用,特别是当与高日志级别结合使用时,因为它提供了可以通过编程方式检查的数据耗尽(分析集合).查看文档.

如果您正在运行非常大的M/R作业,这可能会对性能产生负面影响.

Piggyback通过M/R调试输出

这个想法很简单:添加一个对象数组,其中包含你需要的任何调试信息,比如在_debug字段中,对所有发出的文档和过滤器+连接,如你认为适合在reduce阶段.这样,_debug数组将最终出现在输出集合中.如果您想快速找到特定问题,甚至可以将它们编入索引.

希望这可以帮助.祝好运!