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

时间:2012-12-20 00:27:58

标签: mongodb mapreduce mongoid mongoid3

我正在使用Mongoid 3.0编写map / reduce操作。我正在尝试使用print语句来调试JS函数。这是troubleshooting suggestion from the MongoDB docs,例如:

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

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

2 个答案:

答案 0 :(得分:13)

事实证明,print语句记录到MongoDB服务器日志。在OSX上,即/usr/local/var/log/mongodb/mongo.log

答案 1 :(得分:11)

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

如果这不能解决您的问题,您将不得不深入调试MongoDB M / R,由于以下几个原因这很棘手:

  1. M / R作业在与DB的其余部分隔离的JS作用域中执行
  2. M / R作业无法写入M / R输出文档以外的任何内容
  3. MongoDB中的记录器可以自行决定发送到记录流的内容
  4. 以下是基于我们在生产中广泛使用Mongo M / R的建议:

    提高记录级别

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

    use admin
    db.runCommand( { setParameter: 1, logLevel: 2 } )
    

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

    执行此操作

    将分析级别提高到max(2)

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

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

    通过M / R

    进行Piggyback调试输出

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

    希望这会有所帮助。祝你好运!