【问题标题】:How can I log actual queries to MongoDB with mongo java driver如何使用 mongo java 驱动程序将实际查询记录到 MongoDB
【发布时间】:2018-06-27 19:42:13
【问题描述】:

我想看看 mongo java 驱动程序产生什么查询,但我做不到。

使用来自official documentation 的信息,我只能在日志中看到更新操作执行,但我没有看到此操作的查询。

【问题讨论】:

标签: java mongodb mongo-java mongo-java-driver


【解决方案1】:

您可以将 org.mongodb 的记录器级别设置为 DEBUG,您的 Java 驱动程序将发出详细的记录,如下所示:

2018-01-18 16:51:07|[main]|[NA]|INFO |org.mongodb.driver.connection|Opened connection [connectionId{localValue:2, serverValue:39}] to localhost:27017  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.insert|Inserting 1 documents into namespace stackoverflow.sample on connection [connectionId{localValue:2, serverValue:39}] to server localhost:27017  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.insert|Insert completed  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.command|Sending command {find : BsonString{value='sample'}} to database stackoverflow on connection [connectionId{localValue:2, serverValue:39}] to server localhost:27017  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.command|Command execution completed  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.command|Sending command {findandmodify : BsonString{value='sample'}} to database stackoverflow on connection [connectionId{localValue:2, serverValue:39}] to server localhost:27017  
2018-01-18 16:51:07|[main]|[NA]|DEBUG|org.mongodb.driver.protocol.command|Command execution completed  

在上面的日志输出中可以看到客户端提交的查询的详细信息:

org.mongodb.driver.protocol.command|Sending command {find : BsonString{value='sample'}}

或者,您可以在服务器端启用profiling ...

db.setProfilingLevel(2)

... 使 MongoDB 分析器收集针对该数据库的所有操作的数据。

分析器输出(包括客户端提交的查询)将写入已启用数据库分析的system.profile 集合。

the docs 中的更多详细信息,但简短的摘要是:

// turn up the logging
db.setProfilingLevel(2)

// ... run some commands

// find all profiler documents, most recent first
db.system.profile.find().sort( { ts : -1 } )

// turn down the logging
db.setProfilingLevel(0)

【讨论】:

  • 我已完成您提供的所有步骤。现在在 db 中我可以在这里看到分析: db.system.profile.find().sort( { ts : -1 } ) 但在 java 日志中我看到了下一个: 1) 发送命令 {findandmodify : BsonString{value='blabla '}} 到数据库测试连接 [connectionId{localValue:10, serverValue:718}] 到服务器 127.0.0.1:27018 2)命令执行完成没有真正的查询,如您的示例。您的查询出现在 o.g.sandbox.mongo.MongoClientTest 中。这是你的课吗?你是手动记录的吗?
  • 是的,o.g.sandbox.mongo.MongoClientTest 是我自己的测试类。我已经更新了答案以消除这种可能的混淆。我的回答 do 中显示的其他日志事件包括 MongoDB find 命令的详细信息,例如Sending command {find : BsonString{value='sample'}}.
  • 但我想要在日志中准确查询,就像你在 MongoClientTest 类中所做的那样
  • This:{find : BsonString{value='sample'}}是Java驱动提供的查询形式。我原始答案中的其他日志,来自“o.g.sandbox.mongo.MongoClientTest”的日志不是查询它们是文档,即从服务器检索到的文档。生成这些日志语句的代码如下所示:logger.info(document.toJson()。原始形式的确切查询位于 system.profile 集合中的分析器文档中。
  • 我明白了,谢谢。只是想在 java 日志中而不是在 db 中的 system.profile 之类的东西
【解决方案2】:

如果您使用的是 Spring Boot 1.5.x(我使用的是 1.5.19),您需要将 org.mongodb:mongodb-driver 的版本覆盖到至少 3.7.0 版本才能在日志中获取更多信息。

更多详情请看这张票:https://jira.mongodb.org/browse/JAVA-2698

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多