MongoDBlogging所有查询

这个问题是基本的,因为它很简单…你如何logging所有查询在MongoDB中的“尾”能日志文件?

我努力了:

  • 设置分析级别
  • 设置慢速ms参数启动
  • 与-vv选项的mongod

/var/log/mongodb/mongodb.log不断显示当前活动连接的数量…

您可以logging所有查询:

$ mongo MongoDB shell version: 2.4.9 connecting to: test > use myDb switched to db myDb > db.getProfilingLevel() 0 > db.setProfilingLevel(2) { "was" : 0, "slowms" : 1, "ok" : 1 } > db.getProfilingLevel() 2 > db.system.profile.find().pretty() 

资料来源: http : //docs.mongodb.org/manual/reference/method/db.setProfilingLevel/

db.setProfilingLevel(2)表示logging所有操作。

我最终通过像这样开始mongod来解决这个问题(敲打和丑陋,是的…但是为开发环境工作):

 mongod --profile=1 --slowms=1 & 

这使分析和设置为“慢查询”的阈值为1毫秒,导致所有查询logging为文件的“慢查询”:

 /var/log/mongodb/mongodb.log 

现在我使用下面的命令获得连续的日志输出:

 tail -f /var/log/mongodb/mongodb.log 

一个例子日志:

 Mon Mar 4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms 

因为它的谷歌第一个答案…
对于版本3

 $ mongo MongoDB shell version: 3.0.2 connecting to: test > use myDb switched to db > db.setLogLevel(1) 

http://docs.mongodb.org/manual/reference/method/db.setLogLevel/

我制作了一个命令行工具来激活分析器活动,并以“tail”方式查看日志: “mongotail”

但更有趣的function(也就是tail )是用-f选项来查看“实时”的变化,偶尔用grep过滤结果来find特定的操作。

请参阅https://github.com/mrsarm/mongotail中的文档和安装说明;

MongoDB具有一个复杂的分析function。 日志logging发生在system.profile集合中。 日志可以看到:

 db.system.profile.find() 

有3个日志级别( 来源 ):

  • 级别0 – 分析器closures,不收集任何数据。 mongod总是将比slowOpThresholdMs阈值更长的操作写入其日志。 这是默认的分析器级别。
  • 级别1 – 仅收集缓慢操作的性能分析数据。 默认情况下,慢操作是比100毫秒慢的操作。 您可以使用slowOpThresholdMs运行时选项或setParameter命令修改“慢”操作的阈值。 有关更多信息,请参阅指定缓慢操作的阈值部分。
  • 2级 – 收集所有数据库操作的性能分析数据。

要查看数据库运行的分析级别,请使用

 db.getProfilingLevel() 

并看到状态

 db.getProfilingStatus() 

要更改分析状态,请使用该命令

 db.setProfilingLevel(level, milliseconds) 

其中level指的是性能分析级别, milliseconds级别是查询需要logging的持续时间。 要closures日志logging,请使用

 db.setProfilingLevel(0) 

查询在系统configuration文件集合中查找花费时间超过一秒的所有查询,按时间戳降序排列

 db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } ) 

一旦分析级别使用db.setProfilingLevel(2)

以下命令将打印上次执行的查询。
您可以更改限制(5),以查看更less/更多的查询。
$ nin – 会过滤掉configuration文件和索引查询
此外,使用查询投影{'query':1}仅查看查询字段

 db.system.profile.find( { ns: { $nin : ['meteor.system.profile','meteor.system.indexes'] } } ).limit(5).sort( { ts : -1 } ).pretty() 

仅logging查询投影

 db.system.profile.find( { ns: { $nin : ['meteor.system.profile','meteor.system.indexes'] } }, {'query':1} ).limit(5).sort( { ts : -1 } ).pretty() 

分析器数据被写入数据库中的集合,而不是文件。 见http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

我build议使用10gen的MMS服务,并在那里提供开发分析器数据,在那里你可以过滤和sorting在用户界面。

我认为虽然不够优雅, oplog 可以部分用于这个目的:它logging所有的写入,但不是读取…

如果我是对的,你必须启用复制。 信息来自这个问题的答案 : 如何监听MongoDB集合的更改?

将profilinglevel设置为2是logging所有查询的另一个选项。

我build议检查mongosniff。 这可以工具可以做你想要的一切和更多。 特别是它可以帮助诊断更大规模的mongo系统的问题,以及如何通过侦听所有与mongo相关的通信的networking接口工作来查询路由和来自哪里。

http://docs.mongodb.org/v2.2/reference/mongosniff/

我写了一个脚本,可以在查询进入时实时打印system.profile日志。您需要首先启用日志logging,如其他答案中所述。 我需要这个,因为我正在使用Windows子系统的Linux,尾巴仍然无法正常工作。

https://github.com/dtruel/mongo-live-logger