MongoDB регистрирует все запросы

127

Вопрос такой же простой, насколько это просто... Как вы регистрируете все запросы в файле журнала "хвост" в mongodb?

Я пробовал:

  • настройка уровня профилирования
  • установка медленного параметра ms start
  • mongod с опцией -vv

В файле /var/log/mongodb/mongodb.log отображается только текущее количество активных подключений...

Теги:
logging

13 ответов

75
Лучший ответ

Я решил решить это, начав 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
  • 5
    Должно ли это быть эквивалентно добавлению profile=1 и slowms=1 в /etc/mongodb.conf ?
  • 0
    Я не смог найти /var/log/mongodb/mongodb.log, но это входило в консоль, в которой я нуждался. Спасибо
Показать ещё 5 комментариев
223

Вы можете войти все запросы:

$ 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) означает "регистрировать все операции".

  • 3
    На первый взгляд, похоже, что это лучший ответ, чем принятый ответ.
  • 1
    Не лучше, учитывая, что вопросы требуют настраиваемого файла журнала, но, безусловно, полезно, в случаях, когда у вас нет доступа к файлам журнала, только оболочка mongo, как та, что привела меня сюда :)
Показать ещё 4 комментария
29

Потому что его первый ответ 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/

20

MongoDB имеет сложную функцию профилирования. system.profile журнала происходит в коллекции system.profile. Журналы можно увидеть из:

db.system.profile.find()

Есть 3 уровня ведения журнала (источник):

  • Уровень 0 - профилировщик выключен, не собирает никаких данных. Mongod всегда записывает в свой журнал операции дольше порога slowOpThresholdMs. Это уровень профилировщика по умолчанию.
  • Уровень 1 - собирает данные профилирования только для медленных операций. По умолчанию медленные операции выполняются медленнее, чем 100 миллисекунд. Вы можете изменить порог для "медленных" операций с помощью параметра времени выполнения slowOpThresholdMs или команды setParameter. См. Раздел "Задание порога для медленных операций" для получения дополнительной информации.
  • Уровень 2 - собирает данные профилирования для всех операций базы данных.

Чтобы увидеть, на каком уровне профилирования работает база данных, используйте

db.getProfilingLevel()

и видеть статус

db.getProfilingStatus()

Чтобы изменить статус профилирования, используйте команду

db.setProfilingLevel(level, milliseconds)

Где level относится к уровню профилирования, а milliseconds - это мс, длительности которых запросы должны быть зарегистрированы. Чтобы отключить ведение журнала, используйте

db.setProfilingLevel(0)

Запрос для поиска в коллекции системных профилей для всех запросов, которые заняли более одной секунды, упорядочены по убыванию отметки времени:

db.system.profile.find( { millis : { $gt:1000 } } ).sort( { ts : -1 } )
  • 1
    Согласно документации, уровень логики 0 не означает «отсутствие регистрации», но он регистрирует медленные запросы: «профилировщик выключен, не собирает никаких данных. Mongod всегда записывает в свой журнал операции, превышающие порог slowOpThresholdMs». src: docs.mongodb.com/v3.2/tutorial/manage-the-database-profiler/…
19

Я сделал инструмент командной строки, чтобы активировать активность профайлера и увидеть журналы в режиме "хвоста": "mongotail" .

Но более интересной особенностью (также как tail) является просмотр изменений в "реальном времени" с опцией -f и иногда фильтрация результата с помощью grep для поиска конкретной операции.

См. документацию и инструкции по установке в: https://github.com/mrsarm/mongotail

  • 2
    это самый полный ответ на ФП. особенно в отношении требования «хвостовой».
8

Как только уровень профилирования устанавливается с помощью 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()
7

Данные профилировщика записываются в коллекцию в вашей БД, а не в файл. См. http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

Я бы порекомендовал использовать службу 10gen MMS и там, где вы можете фильтровать и сортировать его в пользовательском интерфейсе.

  • 1
    Да, после активации профилирования уровня 2, коллекция добавляется в базу данных. Однако необходимость перезагружать графический интерфейс или запускать команду каждый раз, когда я выполняю отладку, - это PITA в конце дня ... Вот почему я хотел настраиваемый файл журнала.
4

Настройка профиля для 2 - это еще один вариант для регистрации всех запросов.

4

Я думаю, что, хотя и не элегантный, oplog может быть частично использован для этой цели: он регистрирует все записи, но не читает...

Вы должны включить репликатор, если я прав. Информация от этого ответа от этого вопроса: Как слушать изменения в коллекции MongoDB? p >

3

Я рекомендую проверить mongosniff. Этот инструмент может делать все, что вам нужно, и многое другое. Особенно это может помочь диагностировать проблемы с крупномасштабными системами mongo и как маршрутизируются запросы и откуда они идут, поскольку он работает, слушая ваш сетевой интерфейс для всех связанных с mongo сообщений.

http://docs.mongodb.org/v2.2/reference/mongosniff/

  • 0
    Согласно этой странице, он работает только в среде UNIX, и у меня его нет в папке bin в Windows. Любые рекомендуемые Windows эквивалент?
  • 0
    Вы работаете на удаленном сервере Windows (Azure Cloud и т. Д.) Или локально на вашем компьютере? Если все это локально, Wireshark будет более чем достаточно. Чтобы установить его на Windows, вам нужно собрать mongosniff.exe, который немного недокументирован. Вы следуете инструкциям linux, но вам нужно установить версию winpcap для разработчиков.
Показать ещё 1 комментарий
1

Я написал script, который будет распечатывать журнал system.profile в режиме реального времени по мере поступления запросов. Сначала нужно включить ведение журнала, как указано в других ответах. Мне это нужно, потому что я использую подсистему Windows для Linux, для которой хвост все еще не работает.

https://github.com/dtruel/mongo-live-logger

0

если вы хотите, чтобы запросы регистрировались в файле журнала mongodb, вы должны установить уровень журнала и профилирование, например:

db.setLogLevel(1)
db.setProfilingLevel(2)

(см. https://docs.mongodb.com/manual/reference/method/db.setLogLevel)

Установка только профилирования не приведет к тому, что запросы будут записаны в файл, поэтому вы можете получить его только из

db.system.profile.find().pretty()
0

Попробуйте этот пакет, чтобы выполнить все запросы (без операций с оплогами): https://www.npmjs.com/package/mongo-tail-queries

(Отказ от ответственности: я написал этот пакет именно для этой необходимости)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню