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特定的操作。
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接口工作来查询路由和来自哪里。
我写了一个脚本,可以在查询进入时实时打印system.profile日志。您需要首先启用日志logging,如其他答案中所述。 我需要这个,因为我正在使用Windows子系统的Linux,尾巴仍然无法正常工作。