MongoDB - 记录写入&读取查询

时间:2014-02-17 15:02:48

标签: mongodb logging mongodb-query

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

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

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

编辑:澄清:我们希望将读/写查询记录到常规mongodb日志文件(例如,在MySQL中可以这样做)。

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

2 个答案:

答案 0 :(得分:2)

首先请注意:

  

因为数据库分析器只会对性能产生负面影响   使战略间隔和尽可能最低限度的分析   在生产系统上。

您还可以为每个数据库启用分析器,以减少分析对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供内部使用,不适合大多数用户使用。

希望它有所帮助!

答案 1 :(得分:0)

您可以转换数据库分析,将所有操作写入集合:

db.setProfilingLevel(2)

对表现有轻微影响。

文档:http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

修改 要查看探查器数据,您可以阅读db.system.profile集合。