【问题标题】:How to view a log of all writes to MongoDB如何查看所有写入 MongoDB 的日志
【发布时间】:2015-02-27 23:26:18
【问题描述】:

我能够在 MongoDB 中查看查询,但我尝试查看在 MongoDB 数据库上执行了哪些写入操作,但没有成功。

我的应用程序代码中没有任何写入命令。然而,当我加载测试我的应用程序时,我在 mongostat 中看到一大堆写入。我不确定它们来自哪里。

除了记录写入(我无法做到)之外,还有其他方法可以用来确定这些写入的来源吗?

【问题讨论】:

  • 使用中间人类抽象你的写,所以所有的写都要经过一个类并将日志记录在那里。
  • 应用代码中没有写入。
  • 请分享 mongostat 显示的详细信息,以便我们更深入地了解您的问题
  • @NileshRajani 我将很快分享。实际上,我有一个单独的 MongoDB 死亡问题,我想将其作为单独的 SO 问题保留。
  • @NileshRajani 我已经在此处发布了第二个问题(带有 mongostat 输出):stackoverflow.com/questions/18664166/… 感谢您的帮助。

标签: mongodb


【解决方案1】:

我知道您有几个选项:

a) 如果您怀疑写入将发送到特定数据库,您可以将分析级别设置为 2 以记录所有查询

use [database name]
db.setProfilingLevel(2)
...
// disable when done
db.setProfilingLevel(0) 

b) 您可以使用 -v 以不同级别的 versbosity 启动数据库

  -v [ --verbose ]            be more verbose (include multiple times for more
                              verbosity e.g. -vvvvv)

c) 你可以使用mongosniff 来嗅探端口

d) 如果您使用复制,您还可以检查 local.oplog.rs 集合

【讨论】:

  • 我已经通过 mongod 命令行参数尝试了分析级别。然而,这显然没有坚持。当我按照您的建议进入数据库时​​,db.getProfilingLevel() 仍然等于 0。通过 db.setProfilingLevel(2) 将其设置为 2 确实有效,但它仍然不记录写入。我没有使用复制。 Mongosniff 不是基于我的版本构建的(我使用的是 mongo v1.8.2)。我担心构建一个更新的版本会改变我的结果/堆栈/等(即它不那么可行)。你知道 mongosniff 是在哪个版本引入的吗?
  • 哎哟......好吧,除了强制性的“你真的应该升级”之外,我相信 mongosniff 是在 2.x 中引入的。您是说您在另一个线程中发布的 mongostat 的数百个插入不是来自您的负载测试吗?当您说未记录写入时,您在看哪里? db.system.profile 还是日志文件?
  • 我正在查看日志文件(但 db.system.profile 也是空的)。这些写入仅来自我的负载测试。我无法解释他们。实际上,我现在也在考虑升级,尽管这似乎是强制性的,但这可能是我最好的行动方案。
  • 升级没有帮助。抱歉,我还是看不到文字。我将尝试 mongosniff 看看它是否有效(现在我有不同的版本)。
【解决方案2】:

我已经尝试了 jeffl 的所有建议,其中一个能够向我展示写入内容:mongosniff。谢谢杰夫!

以下是我用来在我的 Ubuntu 10 机器上安装 mongosniff 的命令,以防其他人发现这很有用:

git clone git://github.com/mongodb/mongo.git
cd mongo
git checkout r2.4.6
apt-get install scons libpcap-dev g++
scons mongosniff
build/linux2/normal/mongo/mongosniff --source NET lo 27017

【讨论】:

    【解决方案3】:

    我制作了一个命令行工具来查看日志,并且在不需要其他客户端工具的情况下首先激活分析器活动:“mongotail”。

    要将日志分析激活到级别 2:

    mongotail databasename -l 2
    

    然后显示最近的 10 个查询:

    mongotail databasename
    

    您也可以使用带有-f 选项的工具,以“实时”查看变化。

    mongotail databasename -f
    

    最后,使用egrep 过滤结果以查找特定操作,例如仅显示写入操作:

    mongotail databasename -f | egrep "(INSERT|UPDATE|REMOVE)"
    

    查看文档和安装说明:https://github.com/mrsarm/mongotail

    【讨论】:

    • 组装这个包做得很好。它看起来构造得很好。感谢您的贡献!
    猜你喜欢
    • 2011-02-09
    • 2012-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多