Вопрос такой же простой, насколько это просто... Как вы регистрируете все запросы в файле журнала "хвост" в mongodb?
Я пробовал:
В файле /var/log/mongodb/mongodb.log отображается только текущее количество активных подключений...
Я решил решить это, начав mongod вот так (забитый и уродливый, да... но работает для среды разработки):
mongod --profile=1 --slowms=1 &
Это позволяет профилировать и устанавливает пороговое значение для "медленных запросов" как 1 мс, заставляя все запросы регистрироваться как "медленные запросы" к файлу:
/var/log/mongodb/mongodb.log
Теперь я получаю непрерывные выходные записи журнала с помощью команды:
tail -f /var/log/mongodb/mongodb.log
Пример журнала:
Mon Mar 4 15:02:55 [conn1] query dendro.quads query: { graph: "u:http://example.org/people" } ntoreturn:0 ntoskip:0 nscanned:6 keyUpdates:0 locks(micros) r:73163 nreturned:6 reslen:9884 88ms
Вы можете войти все запросы:
$ mongo
MongoDB shell version: 2.4.9
connecting to: test
> use myDb
switched to db myDb
> db.getProfilingLevel()
0
> db.setProfilingLevel(2)
{ "was" : 0, "slowms" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> db.system.profile.find().pretty()
Источник: http://docs.mongodb.org/manual/reference/method/db.setProfilingLevel/
db.setProfilingLevel(2)
означает "регистрировать все операции".
Потому что его первый ответ Google...
Для версии 3
$ mongo
MongoDB shell version: 3.0.2
connecting to: test
> use myDb
switched to db
> db.setLogLevel(1)
http://docs.mongodb.org/manual/reference/method/db.setLogLevel/
MongoDB
имеет сложную функцию профилирования. system.profile
журнала происходит в коллекции system.profile
. Журналы можно увидеть из:
db.system.profile.find()
Есть 3 уровня ведения журнала (источник):
Чтобы увидеть, на каком уровне профилирования работает база данных, используйте
db.getProfilingLevel()
и видеть статус
db.getProfilingStatus()
Чтобы изменить статус профилирования, используйте команду
db.setProfilingLevel(level, milliseconds)
Где level
относится к уровню профилирования, а milliseconds
- это мс, длительности которых запросы должны быть зарегистрированы. Чтобы отключить ведение журнала, используйте
db.setProfilingLevel(0)
Запрос для поиска в коллекции системных профилей для всех запросов, которые заняли более одной секунды, упорядочены по убыванию отметки времени:
db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
Я сделал инструмент командной строки, чтобы активировать активность профайлера и увидеть журналы в режиме "хвоста": "mongotail" .
Но более интересной особенностью (также как tail
) является просмотр изменений в "реальном времени" с опцией -f
и иногда фильтрация результата с помощью grep
для поиска конкретной операции.
См. документацию и инструкции по установке в: https://github.com/mrsarm/mongotail
Как только уровень профилирования устанавливается с помощью db.setProfilingLevel(2)
.
В приведенной ниже команде будет напечатан последний выполненный запрос.
Вы можете изменить предел (5), чтобы увидеть меньше/больше запросов.
$ nin - отфильтрует запросы профиля и индексов
Кроме того, используйте проекцию запроса {'query': 1} только для просмотра поля запроса
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
}
).limit(5).sort( { ts : -1 } ).pretty()
Журналы с запросом прогноза
db.system.profile.find(
{
ns: {
$nin : ['meteor.system.profile','meteor.system.indexes']
}
},
{'query':1}
).limit(5).sort( { ts : -1 } ).pretty()
Данные профилировщика записываются в коллекцию в вашей БД, а не в файл. См. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/
Я бы порекомендовал использовать службу 10gen MMS и там, где вы можете фильтровать и сортировать его в пользовательском интерфейсе.
Настройка профиля для 2 - это еще один вариант для регистрации всех запросов.
Я думаю, что, хотя и не элегантный, oplog может быть частично использован для этой цели: он регистрирует все записи, но не читает...
Вы должны включить репликатор, если я прав. Информация от этого ответа от этого вопроса: Как слушать изменения в коллекции MongoDB? p >
Я рекомендую проверить mongosniff. Этот инструмент может делать все, что вам нужно, и многое другое. Особенно это может помочь диагностировать проблемы с крупномасштабными системами mongo и как маршрутизируются запросы и откуда они идут, поскольку он работает, слушая ваш сетевой интерфейс для всех связанных с mongo сообщений.
Я написал script, который будет распечатывать журнал system.profile в режиме реального времени по мере поступления запросов. Сначала нужно включить ведение журнала, как указано в других ответах. Мне это нужно, потому что я использую подсистему Windows для Linux, для которой хвост все еще не работает.
если вы хотите, чтобы запросы регистрировались в файле журнала mongodb, вы должны установить уровень журнала и профилирование, например:
db.setLogLevel(1)
db.setProfilingLevel(2)
(см. https://docs.mongodb.com/manual/reference/method/db.setLogLevel)
Установка только профилирования не приведет к тому, что запросы будут записаны в файл, поэтому вы можете получить его только из
db.system.profile.find().pretty()
Попробуйте этот пакет, чтобы выполнить все запросы (без операций с оплогами): https://www.npmjs.com/package/mongo-tail-queries
(Отказ от ответственности: я написал этот пакет именно для этой необходимости)
profile=1
иslowms=1
в/etc/mongodb.conf
?