Insert JSON from stdin into MongoDB
This project is part of the pino
logger family, however you can use it to parse and insert any
JSON
into the mongo
.
$ npm i pino-mongodb
You can use this module as a pino transport like so:
const pino = require('pino')
const transport = pino.transport({
target: 'pino-mongodb',
level: 'info',
options: {
uri: 'mongodb://localhost:27017/',
database: 'logs',
collection: 'log-collection',
mongoOptions: {
auth: {
username: 'one',
password: 'two'
}
}
}
})
pino(transport)
The mongoOptions
is provided to the the standard mongodb client. All the available options are described on its official documentation.
Note that you may encouter missing logs in special cases: it dependes on data and mongo's version. Please checkout the mongodb limitation official documentation.
For example on MongoDB 4:
// IT DOES NOT WORK:
log.info({ $and: [{ a: 1 }, { b: 2 }] }, 'my query is')
// IT WORKS:
log.info({ query: { $and: [{ a: 1 }, { b: 2 }]} }, 'my query is')
If you want a custom parser to handle the above case. You need to wrap pino-mongo
and pass a function through option.parseLine
. Any value that is not a function will be ignored in this option.
// mongo-transport.js
'use strict'
const transport = require('pino-mongodb')
module.exports = function(opts) {
opts.parseLine = function(str) { // `str` is passed from `pino` and expected to be a string
const obj = JSON.parse(str)
// do anything you want...
return obj // return value is expected to be a json that will pass and save inside mongodb
}
return transport(opts)
}
// main.js
const pino = require('pino')
const transport = pino.transport({
target: './mongo-transport.js',
uri: 'mongodb://localhost:27017/logs',
collection: 'log-collection',
})
pino(transport)
Pino supports a legacy transport interface that is still supported by this module.
$ echo '{"name": "Viktor"}' | pino-mongodb [options] [mongo-url]
$ cat many.logs | pino-mongodb [options] [mongo-url]
$ node ./app.js | pino-mongodb [options] [mongo-url]
Usage: pino-mongodb [options] [mongo-url]
Insert JSON from stdin into MongoDB
Options:
-V, --version output the version number
-c, --collection <name> database collection (default: "logs")
-o, --stdout output inserted documents into stdout (default:
false)
-e, --errors output insertion errors into stderr (default: false)
-h, --help display help for command
To run unit tests:
$ npm t
To run integrational tests with real mongo server:
$ npm run trial
Note, you will have to have docker
and docker-compose
installed
on your machine for that!
Licensed under MIT.