Как я могу регистрировать фактические запросы к MongoDB с помощью java-драйвера mongo

Я хочу посмотреть, какие запросы производит java-драйвер mongo, но я не могу этого сделать.

Используя информацию из официальной документации I ' Я могу просто видеть в журнале, что выполняется операция обновления, но я не вижу запроса этой операции.


person Deplake    schedule 18.01.2018    source источник
comment
Посмотрите этот ответ: stackoverflow.com/a/39721643/316343   -  person Jahan    schedule 01.06.2021


Ответы (2)


Вы можете установить уровень ведения журнала для 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'}}

Кроме того, вы можете включить профилирование на стороне сервера. .

db.setProfilingLevel(2)

... заставляет профилировщик MongoDB собирать данные для всех операций с этой базой данных.

Выходные данные профилировщика (который включает запрос, отправленный клиентом) записываются в коллекцию system.profile в зависимости от того, какое профилирование базы данных было включено.

Более подробная информация представлена ​​в документах, но краткое изложение:

// 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)
person glytching    schedule 18.01.2018
comment
Я выполнил все указанные вами шаги. Теперь в базе данных я вижу профилирование здесь: 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. Это ваш класс и вы его вручную прописываете? - person Deplake; 19.01.2018
comment
Да, o.g.sandbox.mongo.MongoClientTest - это мой собственный тестовый класс. Я обновил ответ, чтобы устранить эту возможную путаницу. Другие события журналов, показанные в моем ответе do, включают подробную информацию о команде MongoDB find, например. Sending command {find : BsonString{value='sample'}}. - person glytching; 19.01.2018
comment
Но мне нужен точный запрос в журнале, как в вашем классе MongoClientTest. - person Deplake; 19.01.2018
comment
Это: {find : BsonString{value='sample'}} - это запрос в форме, предоставленной драйвером Java. Другие журналы в моем исходном ответе, например, из o.g.sandbox.mongo.MongoClientTest, не были запросами, они были документами, то есть документом, который был получен с сервера. Код, создавший эти операторы журналов, выглядел следующим образом: logger.info(document.toJson(). Точные запросы в их необработанной форме находятся в документах профилировщика в коллекции system.profile. - person glytching; 19.01.2018
comment
Ясно спасибо. Просто хотел что-то вроде system.profile в журнале java, а не в db - person Deplake; 19.01.2018
comment
Для меня это работало с org.mongodb, а не с com.mongodb. - person Mohamed Gara; 20.03.2020
comment
Если запрос длинный, он отображается не полностью. Вы знаете, как регистрировать полный запрос? - person Noel; 20.10.2020

Если вы используете Spring Boot 1.5.x (я нахожусь на 1.5.19), вам нужно переопределить версию org.mongodb:mongodb-driver как минимум до версии 3.7.0, чтобы получить дополнительную информацию в журналах.

См. Этот билет для получения дополнительных сведений: https://jira.mongodb.org/browse/JAVA-2698

person jeremyt    schedule 17.01.2019