6

我正在用 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

不幸的是,该语句的输出print既没有显示在控制台上,也没有显示在日志上——似乎这在 DB、驱动程序、Moped 或任何中间层之间的某个地方被抑制了。有没有办法打开这个?

4

2 回答 2

13

结果是print语句记录到 MongoDB 服务器日志。在 OSX 上,即/usr/local/var/log/mongodb/mongo.log

于 2012-12-20T00:55:10.247 回答
11

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

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

  1. M/R 作业在与数据库其余部分隔离的 JS 范围内执行
  2. M/R 作业不能写入 M/R 输出文档以外的任何内容
  3. MongoDB 中的记录器可以自行决定向记录流发送什么

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

提高日志记录级别

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

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

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

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

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

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

通过 M/R 搭载调试输出

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

希望这可以帮助。祝你好运!

于 2012-12-20T00:48:35.703 回答