MongoDB - 记录写入和读取查询

5
我们正在尝试记录MongoDB中的读写操作。我们希望实际查询被记录到文件中。 我们使用以下配置(在副本集中的主节点中):
logpath=/.../mongodb.log
logappend=true
profile=2
slowms=1
diaglog=3
verbose=true
vvvv=true

据我理解,这应该是可以实现的。但是在日志中我们只能看到查询的类型(drop/insert/update等)和集合,而无法看到实际执行的查询语句。
编辑:为了澄清:我们想要记录读写查询到常规mongodb日志文件中(就像你可以在MySQL中做的那样)。
可能的问题是什么?有人有任何想法吗? 谢谢!

MongoDB的哪个版本? - Omar Qureshi
2个回答

3

首先请注意:

由于数据库分析器可能会对性能产生负面影响,因此仅在战略间隔中并尽可能少地在生产系统上启用分析。

您还可以按数据库启用分析器,以减少对mongo实例的分析影响。 在您的情况下,slowms = 1是多余的,profile = 2 将记录所有查询,无论它们需要多长时间。

这里有一个简单的测试,可检查查看分析数据是否需要额外配置:

db.setProfilingLevel(2)
db.testProf.insert({x : 1})
db.testProf.update({x : 1}, {$set : {x : 2}})
db.testProf.find({x : 2})
db.testProf.remove({x : 2})
db.setProfilingLevel(0)

现在您可以查询个人资料数据以获取详细信息:
db.system.profile.find().pretty()

这应该显示每个操作的运行时信息。以下是更新操作详细信息的摘录:
"op" : "update",
    "ns" : "profDb.testProf",
    "query" : {
            "x" : 1
    },
    "updateobj" : {
            "$set" : {
                    "x" : 2
            }
    },
    "nscanned" : 1,
    "nupdated" : 1,
    "fastmod" : true,
    "keyUpdates" : 0,
    "numYield" : 0,
    "lockStats" : {
            "timeLockedMicros" : {
                    "r" : NumberLong(0),
                    "w" : NumberLong(1131)
            },
            "timeAcquiringMicros" : {
                    "r" : NumberLong(0),
                    "w" : NumberLong(5)
            }
    }

query字段包含更新条件,而updateobj字段包含对文档执行的更新操作。如果您执行相同的操作,但是query字段仍为空,那么可能是因为您对所有文档运行了更新、删除等操作。

有关如何解释配置数据的更多信息,请参阅文档-数据库分析器输出

编辑: 刚刚注意到配置中的diaglog=3。这个配置主要用于记录和重放操作。它会保留非常详细的日志,并且也会对性能产生负面影响。我认为您应该跳过它。分析已足以实现您想要的结果。

编辑: 不确定您为什么需要将配置数据保存到文件中,因为我认为将其保存到集合中会更方便。您可以像查询任何其他集合一样查询您感兴趣的数据。我不知道是否有将配置数据直接流式传输到文件的方法,但是您可以随时将其导出,例如:

mongoexport --db profDb --collection system.profile --out profiler.json

你说得对,diaglog会将所有数据写入文件,但它使用的是内部格式,不太友好且难以阅读。

diaglog是用于内部使用,不适用于大多数用户。

希望这有所帮助!


谢谢您的回答。也许我误解了,但您建议在mongo shell中查看查询,但我们需要将它们记录到日志文件中... - Ayelet
不确定为什么你需要把它放在文件里,无论如何请看我的更新。 - Maksym Strukov
对我来说,似乎很奇怪的是,你不能像MySQL一样将查询记录到常规的mongodb日志文件中。你提出的解决方案并不适合我们的目的。 - Ayelet
是的,你也可以用MSSQL轻松地完成它。如果有人能提供更好的解决方案,我会很高兴。不过,只是出于好奇,没有争论的意图,你为什么需要将它保存在文件中呢? - Maksym Strukov

0

这不是与配置文件中的 profile=2 是同样的事情吗? - Ayelet
正确的。为了查看分析器数据,您可以读取db.system.profile集合;那里是数据被写入的地方,而不是日志。(http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/#view-profiler-data) - Rishi
对不起,我不明白它与我所做的有什么不同(而且没有起作用)。 - Ayelet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接