MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да активирате регистриране за Mongoose и драйвера MongoDB Node.JS

Събирането на подробни регистрационни файлове е критична стъпка при отстраняване на грешки, свързани с връзката с MongoDB. В тази кратка публикация ще покажем как да активирате влизане в MongoDB Node.JS драйвер и Mongoose. В тази дискусия се позоваваме на версията на Mongoose 5.x и версията на драйвера 3.5.

Регистриране на драйвера MongoDB Node.JS

Механизмът за регистриране на собствения драйвер е добре обяснен в документацията за регистриране. Основните характеристики са:

  • Има 3 нива на регистрационни файлове – debug , info , warn и error . По подразбиране е error . info е достоен избор, когато се опитвате да отстраните проблеми. debug позволява изключително подробно проследяване, така че използвайте го само когато регистрационните файлове, генерирани в info ниво не са достатъчни.
  • По подразбиране регистрационните файлове отиват в console.log()

Задаване на нивото на регистрационния файл

В код

const MongoClient = require('mongodb').MongoClient;
const Logger = require('mongodb').Logger;
Logger.setLevel('info');

Когато задавате нивото на регистрационния файл в кода, можете също да добавяте филтри за конкретни класове. Напр.

Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things

Чрез опции

logger и logLevel може да се предава и чрез опции за връзка, показваме ви пример в секцията Mongoose.

Регистриране за Mongoose

Активирането на регистриране на ниво за отстраняване на грешки за Mongoose е просто:

mongoose.set('debug', true)

Това обаче позволява регистриране само на операции на MongoDB като заявки и актуализации. Ако искате да отстраните проблеми, свързани с връзката, пула за връзки и т.н., това не е от полза.

От друга страна, тъй като Mongoose използва драйвера MongoDB Node.JS отдолу, ако активираме регистриране за драйвера, ще можем да получим регистрационни файлове и от драйвера. Най-лесният начин да направите това е да предадете опции, свързани с дневника. Напр.

// logging options for the driver
var options = {
    logger: console.log,
    loggerLevel: 'info',
    poolSize: 10
}

var uri = 'mongodb://user:pass@localhost:port,anotherhost:port,yetanother:port/mydatabase';
// with options
mongoose.connect(uri, options);

Освен специфичните за Mongoose опции, Mongoose предава всички други опции надолу на драйвера. Документацията на драйвера обяснява следните опции:

  • loggerLevel – низ – по избор – Нивото на регистриране (грешка/предупреждение/информация/отстраняване на грешки)
  • logger – обект – по избор – Персонализиран регистрационен обект

В примера по-горе предаваме loggerLevel като info и logger като console.log .

Как да активирате регистрирането за Mongoose и драйвера MongoDB Node.JS Щракнете за Tweet

Персонализиран регистратор

Въпреки че документацията на драйвера предоставя пример за писане на персонализирани регистратори, това не е много полезно. Обикновено се опитваме да изпратим тези регистрационни файлове в различен файл, далеч от стандартните регистрационни файлове на приложенията и можем да използваме персонализираната функционалност на регистратора, за да можем да направим това.

Ако погледнете изходния код за регистриране на драйвера, става ясно следното:

  • Регистраторът по подразбиране еconsole.log
  • Регистраторът трябва да е функция
  • Функцията регистратор отнема две аргументи:
    • Низът на съобщението във формата, както следва:
      [LEVEL-className:pid] timestamp logMsg

      Например:

      [INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
    • Обект на състояние, който съдържа следната информация:
      var state = {
        type: 'warn', // level
        message: message, // log message
        className: className, // className
        pid: pid,
        date: dateTime
      };

      Например:

      {
         type: 'info',
        message:
         'server sg-rs-91.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}',
         className: 'Server',
         pid: 9224,
         date: 1589439590772
      }
      

Така че, за да напишете персонализиран регистратор, можете просто да напишете функция, която да използва рамка за регистриране по ваш избор, за да регистрирате тези съобщения във формат, който желаете.

Ето един доста примитивен регистратор на Bunyan, настроен като персонализиран регистратор:

var Logger = require('bunyan');
var log = Logger.createLogger({
  name: "MongoDB Driver",
  streams: [
  {
    stream: process.stdout,
    level: 'info'
  },
  {
      stream: process.stdout,
      level: 'debug'
  },
  {
      stream: process.stderr,
      level: 'error'
  }
  ],
});
 
function mongoLogger(msg, state) {
  // console.log(msg, state);
 
  switch (state.type) {
    case 'debug':
      log.debug(state);
      break;
    case 'info':
      log.info(state);
      break;
    case 'warn':
      log.warn(state);
    case 'error':
    default:
      log.error(state);
  }
}

След това го предайте във вашите опции:

var options = {
  logger: mongoLogger,
  loggerLevel : 'info'
}

Изходът от console.log ще бъде:

[INFO-Server:9413] 1589442507330 server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"} { type: 'info',
  message:
   'server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {"name":"MongoNetworkError","message":"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017","stack":"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"}',
  className: 'Server',
  pid: 9413,
  date: 1589442507330 }

Изходът на Bunyan ще бъде:

{"name":"MongoDB Driver","hostname":"<hostname>","pid":9413,"level":30,"type":"info","message":"server SG-example-85.servers.scalegrid.io:27017 fired event close out with message {\"name\":\"MongoNetworkError\",\"message\":\"getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\",\"stack\":\"Error: getaddrinfo ENOTFOUND SG-example-85.servers.scalegrid.io SG-example-85.servers.scalegrid.io:27017\\n	at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)\"}","className":"Server","date":1589442507330,"msg":"","time":"2020-05-14T07:48:27.331Z","v":0}

След това ще можете да използвате всички функции на Bunyan, за да се справите с регистрационните файлове, както сметнете за добре, напр. изпращането им до въртящ се файл, отделянето на съобщения за грешки и информация и т.н.

Надяваме се, че това ръководство за активиране на влизане в драйвера MongoDB Node.JS и Mongoose е било полезно за вас при настройката ви. Чувствайте се свободни да оставите коментар в секцията за коментари по-долу, ако имате въпроси или се нуждаете от помощ.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Импортирайте JSON файл в MongoDB с mongoimport

  2. Уникалният индекс на Mongo не е чувствителен към малки и големи букви

  3. MongoDB заместващ знак в ключа на заявка

  4. 2 начина за добавяне на стойност към масив в MongoDB

  5. Как да върна актуализиран документ от метода findOneAndUpdate?