La collecte de journaux détaillés est une étape critique lors du débogage des problèmes liés à la connexion avec MongoDB. Dans ce court article, nous montrerons comment activer la journalisation sur le pilote MongoDB Node.JS et Mongoose. Nous nous référons à la version 5.x de Mongoose et à la version 3.5 du pilote dans cette discussion.
Journaliser le pilote MongoDB Node.JS
Le mécanisme de journalisation pour le pilote natif est bien expliqué dans la documentation de journalisation. Les fonctionnalités essentielles sont :
- Il existe 3 niveaux de journalisation :
debug
,info
,warn
eterror
. La valeur par défaut esterror
.info
est un choix décent lorsque vous essayez de déboguer des problèmes.debug
permet un traçage extrêmement détaillé, donc utilisez-le uniquement lorsque les journaux générés à l'info
le niveau ne suffit pas. - Par défaut, les journaux vont à
console.log()
Définir le niveau de journalisation
Dans le code
const MongoClient = require('mongodb').MongoClient; const Logger = require('mongodb').Logger; Logger.setLevel('info');
Lorsque vous définissez le niveau de journalisation dans le code, vous pouvez également ajouter des filtres pour des classes spécifiques. Par exemple
Logger.filter('class', ['Connection', 'Pool']); // Log only Connection and Pool create things
Par les options
Le logger
et logLevel
peut également être transmis via les options de connexion, nous vous montrons un exemple dans la section Mangouste.
Enregistrement pour Mongoose
L'activation de la journalisation au niveau du débogage pour Mongoose est simple :
mongoose.set('debug', true)
Cependant, cela n'active que la journalisation des opérations MongoDB telles que les requêtes et les mises à jour. Si vous cherchez à déboguer des problèmes liés à la connexion, au pool de connexions, etc., cela ne vous sera d'aucune utilité.
D'autre part, étant donné que Mongoose utilise le pilote MongoDB Node.JS en dessous, si nous activons la journalisation pour le pilote, nous pourrons également obtenir les journaux du pilote. La façon la plus simple de le faire est de passer les options liées au journal. Par exemple
// 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);
À l'exception des options spécifiques à Mongoose, Mongoose transmet toutes les autres options au pilote. La documentation du pilote explique les options suivantes :
loggerLevel
– chaîne – facultatif – Le niveau de journalisation (error/warn/info/debug)logger
– objet – facultatif – Objet de journalisation personnalisé
Dans l'exemple ci-dessus, nous passons le loggerLevel
comme info
et le logger
comme console.log
.
Enregistreur personnalisé
Même si la documentation du pilote fournit un exemple sur l'écriture d'enregistreurs personnalisés, ce n'est pas très utile. Habituellement, nous essayons d'envoyer ces journaux dans un fichier différent, loin des journaux d'application standard et nous pouvons utiliser la fonctionnalité de journalisation personnalisée pour pouvoir le faire.
Si vous regardez le code source de journalisation du pilote, ce qui suit devient clair :
- L'enregistreur par défaut est
console.log
- Le logger doit être une fonction
- La fonction d'enregistrement prend deux arguments :
- La chaîne de message au format suivant :
[LEVEL-className:pid] timestamp logMsg
Par exemple :
[INFO-Server:9224] 1589439590772 server sg-example-100.servers.scalegrid.io:27017 fired event error out with message {"name":"MongoNetworkError"}
- Un objet d'état qui contient les informations suivantes :
var state = { type: 'warn', // level message: message, // log message className: className, // className pid: pid, date: dateTime };
Par exemple :
{ 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 }
Ainsi, afin d'écrire un enregistreur personnalisé, vous pouvez simplement écrire une fonction pour utiliser un cadre de journalisation de votre choix pour enregistrer ces messages dans un format que vous souhaitez.
Voici un enregistreur Bunyan assez primitif configuré en tant qu'enregistreur personnalisé :
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); } }
Ensuite, passez-le dans vos options :
var options = { logger: mongoLogger, loggerLevel : 'info' }
La sortie de console.log sera alors :
[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 }
La sortie Bunyan sera :
{"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}
Vous pourrez alors utiliser toutes les fonctionnalités de Bunyan pour gérer les logs comme bon vous semble, par ex. en les envoyant dans un fichier rotatif, en séparant les messages d'erreur et d'information, etc.
Nous espérons que ce guide sur l'activation de la journalisation sur le pilote MongoDB Node.JS et Mongoose vous a été utile dans votre configuration. N'hésitez pas à laisser un commentaire dans la section des commentaires ci-dessous si vous avez des questions ou avez besoin d'aide.