MongoDB - 记录写入和读取查询

标签 mongodb logging mongodb-query

我们正在尝试记录 MongoDB 中的读写操作。我们希望将实际查询记录到文件中。 我们正在使用以下配置(在副本集中的主节点中):

logpath=/.../mongodb.log
logappend=true
profile=2
slowms=1
diaglog=3
verbose=true
vvvv=true

据我了解,这应该可行。但是,在日志中我们只能看到查询的类型(删除/插入/更新等)和集合,而不能看到实际执行的查询。

编辑:澄清一下:我们想将读/写查询记录到常规 mongodb 日志文件(与您在 MySQL 中所做的相同)。

可能是什么问题?有人有什么想法吗? 谢谢!

最佳答案

首先请注意:

Because the database profiler can negatively impact performance, only enable profiling for strategic intervals and as minimally as possible on production systems.

您还可以为每个数据库启用分析器,以减少对 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 字段仍然为空,则可能您对所有文档运行了更新、删除等操作。

有关如何解释配置文件数据的更多信息,请参阅文档 - Database Profiler Output

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

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

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

你是对的,diaglog 将所有数据写入一个文件,但这个是内部格式,用户不友好且难以阅读。

diaglog is for internal use and not intended for most users.

希望对您有所帮助!

关于MongoDB - 记录写入和读取查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21832407/

相关文章:

mongodb - 将值转换为键 mongodb 聚合

database - 在 Cloudant 中记录输出

c# - 如何使用具有 native JSON 标准语法的 MongoDB C# 驱动程序发出查找命令?

python - 通过 httpd 上的 Flask-PyMongo 连接到 MongoHQ URI 时出现 ConnectionFailure

javascript - 根据 Group Mongoose 查找最新记录

android - 是否有可能从 “unfortunately app has stopped working”错误中获取更多信息?

ruby-on-rails - 如何防止 Rails ActiveRecord 记录 blob 内容?

Mongodb聚合匹配查询,优先全匹配

Mongodb findoneandupdate 与聚合管道

node.js - Mongoose 中的 model.find({}) 没有给出 db.model.find() 的输出