我正在使用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或任何中间层之间的某处都被抑制了。有没有办法打开它?
答案 0 :(得分:13)
事实证明,print
语句记录到MongoDB服务器日志。在OSX上,即/usr/local/var/log/mongodb/mongo.log
答案 1 :(得分:11)
根据海报的评论,第一步是确保您正在查看mongod
服务器日志。在本地执行此操作的最简单方法是访问鲜为人知的HTTP接口mongod
:http://localhost:28017
。即使服务器未安装在其默认位置,这也将起作用,因此,日志不会位于特定于操作系统的默认位置,例如Mac OS X上的/usr/local/var/log/mongodb/mongo.log
。
有关如何在非标准部署环境中访问此内容,请参阅the docs。
如果这不能解决您的问题,您将不得不深入调试MongoDB M / R,由于以下几个原因这很棘手:
以下是基于我们在生产中广泛使用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
数组将最终出现在输出集合中。如果您想快速找到特定问题,甚至可以将它们编入索引。
希望这会有所帮助。祝你好运!