MongoDB记录所有查询

Joã*_*lva 157 logging mongodb

问题是基本的,因为它很简单...如何在mongodb中的"尾部"日志文件中记录所有查询?

我试过了:

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

/var/log/mongodb/mongodb.log只显示当前活动连接数...

Kri*_*mbi 241

您可以记录所有查询:

$ 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()
Run Code Online (Sandbox Code Playgroud)

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

db.setProfilingLevel(2) 表示"记录所有操作".

  • 我尝试将分析级别设置为2,但我还需要将第二个参数设置为-1,如`db.setProfilingLevel(2,-1)` (10认同)
  • `db.system.profile.find().pretty()`什么都没有给我 (5认同)
  • 乍一看,看起来这是一个比接受的答案更好的答案. (3认同)
  • 对于那些对日志感兴趣的人,doc指出:mongod将数据库探查器的输出写入`system.profile`集合. (3认同)
  • 考虑到这些问题要求提供一个可尾的日志文件,这并不更好,但是绝对有用,在您无权访问日志文件的情况下,只有mongo shell,就像带我到这里的那个一样:) (2认同)

Joã*_*lva 81

我最终通过启动这样的mongod来解决这个问题(锤击和丑陋,是的......但是适用于开发环境):

mongod --profile=1 --slowms=1 &
Run Code Online (Sandbox Code Playgroud)

这样可以进行性能分析并将"慢查询"的阈值设置为1ms,从而将所有查询记录为对文件的"慢查询":

/var/log/mongodb/mongodb.log
Run Code Online (Sandbox Code Playgroud)

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

tail -f /var/log/mongodb/mongodb.log
Run Code Online (Sandbox Code Playgroud)

示例日志:

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
Run Code Online (Sandbox Code Playgroud)

  • 这应该等同于在`/ etc/mongodb.conf`中添加`profile = 1`和`slowms = 1`行吗? (5认同)
  • 无需重启你可以简单地使用`db.setProfilingLevel(level,slowms)`.例如:`db.setProfilingLevel(2,1)`将level设置为2,将查询阈值设置为1ms. (5认同)
  • 您可以根据官方Mongo文档将`--profile = 2`添加到`/ etc/mongodb.conf`,任何所有操作都将被记录. (4认同)

bar*_*rak 31

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

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

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


xam*_*mir 24

MongoDB具有复杂的剖析功能.日志记录发生在system.profile集合中.日志可以从以下位置看到:

db.system.profile.find()
Run Code Online (Sandbox Code Playgroud)

有3个日志记录级别():

  • 0级 - 分析器关闭,不收集任何数据.mongod总是将比slowOpThresholdMs阈值更长的操作写入其日志.这是默认的探查器级别.
  • 级别1 - 仅收集慢速操作的分析数据.默认情况下,慢速操作慢于100毫秒.您可以使用slowOpThresholdMs运行时选项或setParameter命令修改"慢"操作的阈值.有关详细信息,请参阅"为慢速操作指定阈值"部分.
  • 级别2 - 收集所有数据库操作的分析数据.

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

db.getProfilingLevel()
Run Code Online (Sandbox Code Playgroud)

并查看状态

db.getProfilingStatus()
Run Code Online (Sandbox Code Playgroud)

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

db.setProfilingLevel(level, milliseconds)
Run Code Online (Sandbox Code Playgroud)

Where level指的是分析级别,并且milliseconds是需要记录查询的持续时间的ms.要关闭日志记录,请使用

db.setProfilingLevel(0)
Run Code Online (Sandbox Code Playgroud)

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

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
Run Code Online (Sandbox Code Playgroud)


Mar*_*uiz 22

我创建了一个命令行工具来激活探查器活动并以"尾部"方式查看日志:"mongotail".

但更有趣的功能(也是如此tail)是使用该选项查看"实时"的变化-f,并偶尔过滤结果grep以查找特定操作.

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

  • 这是对OP的最完整回应.ESP.关于'尾巴'的要求. (2认同)

Fai*_*eef 11

使用后设置性能分析级别db.setProfilingLevel(2).

以下命令将打印上次执行的查询.
您也可以更改限制(5)以查看更少/更多的查询.
$ nin - 将过滤掉配置文件和索引查询
另外,使用查询投影{'query':1}仅查看查询字段

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

仅包含查询投影的日志

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


Han*_*ort 7

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

我建议使用10gen的MMS服务,并在那里提供开发分析器数据,您可以在UI中对其进行过滤和排序.


Dar*_*ica 7

如果要将查询记录到mongodb日志文件中,则必须同时设置日志级别和分析,例如:

db.setLogLevel(1)
db.setProfilingLevel(2)
Run Code Online (Sandbox Code Playgroud)

(请参阅https://docs.mongodb.com/manual/reference/method/db.setLogLevel

仅设置概要分析不会将查询记录到文件中,因此您只能从

db.system.profile.find().pretty()
Run Code Online (Sandbox Code Playgroud)