Log all API request to mongoDB using morgan and winston with node express
I suggest using the package express-winston. See link for documentation.After install package, npm i express-winston, create middleware name logger.js (or whatever you please). copy the following code below
const expressWinston = require('express-winston');const requestLog = expressWinston.logger({ transports: [ new winston.transports.Console({ format: winston.format.json({ space: 2 }) }), new winston.transports.MongoDB({ db: 'localhost:27001', //Your Db connection options: { useNewUrlParser: true, poolSize: 2, autoReconnect: true } }) ], meta: true, msg: "Request: HTTP {{req.method}} {{req.url}}; Username: {{req.user.preferred_username}}; ipAddress {{req.connection.remoteAddress}}", requestWhitelist: [ "url", "method", "httpVersion", "originalUrl", "query", "body" ]});exports.requestLog = requestLog;
The in your app.js file, require the logger file so that is applied globally:
const logger = require('../middleware/logger');const express = require('express');const app = express();app.use(logger.requestLog);
There are additional options you can include like for example:expressWinston.responseWhitelist.push('body')
that will provide the response body in the object.
You can remove the transport for the console if you don't want to see all request, i only added it so you can see the object without going to the database each time.