Issue
I am using winston logger. I want to add uuid in every logs having same uuid per request.
In app.js
var distributorapp = require('./routes/distributorapp');
app.use('/dstapp',distributorapp);
In routes/distributorapp.js(Middleware)
var qs = require('querystring');
var request = require('request');
var logger = require('../locallibs/logger');
var uuid = require('uuid/v1');
module.exports = {
mddlw: function (req, res, next) {
req.bodyData = qs.parse(req.body); // parsing body and added to request object
req.uuid = uuid(); // Adding uuid to request to available every where throught request
callHsmRest(req, res); // function to do some logic and handle middleware functionality
}
};
In logger.js
var winston = require('winston');
var fs = require('fs');
var moment = require('moment');
var today = moment().format('YYYY-MM-DD');
if (!fs.existsSync(today)) {
fs.mkdirSync(today);
}
function customFileFormatter(options) {
console.log(options);
return options.timestamp() + ' [' + options.level.toUpperCase() + '] ' + (undefined !== options.message ? options.message : '') +
(options.meta && Object.keys(options.meta).length ? JSON.stringify(options.meta) : '');
}
var logger = new (winston.Logger)({
transports: [
new (winston.transports.File)({
timestamp: function () {
return moment().format();
},
json: false,
filename: today + '/test.log',
formatter: customFileFormatter
})
]
});
Now in every request I want to generate uuid and add it to request body.So I have added in Middleware.But how it will be available to logger.js in customFileFormatter formatter function?
When some one uses this logger to log any data i want that uuid to be prepended in logger formatter in every logs through request.
If some one require logger.js
and do
logger.info("Hello");
logger.info("Hi");
Currently following I have following logs
2017-02-24T12:36:23+05:30 [INFO] “Hello”
2017-02-24T12:36:23+05:30 [INFO] “Hi”
But I want
2017-02-24T12:36:23+05:30 [INFO] c00d6800-fa5f-11e6-83c2-f531bfc95472 “Hello”
2017-02-24T12:36:23+05:30 [INFO] c00d6800-fa5f-11e6-83c2-f531bfc95472 “Hi”
Also I want to change logger file path according to route middleware.
Currently when request came from /dstapp
it uses distributorapp
Middleware and every subsequent logs from this request goes to path dstapp/2017-02-24/test.log
But when request came from lets say /anotherapp
it uses anotherapp
Middleware and subsequent logs from this request goes to path anotherapp/2017-02-24/test.log
I have searched through every where but can’t find any solution
Thanks in Advance
Solution
I have found way around for this.
In app.js
var logger = require('./locallibs/logger');
app.use(logger)
app.use('/dstapp',distributorapp);
My logger.js
var winston = require('winston');
var fs = require('fs');
var moment = require('moment');
var today = moment().format('YYYY-MM-DD');
var uuid = require('uuid/v1');
if (!fs.existsSync(today)) {
fs.mkdirSync(today);
}
function customFileFormatter(options) {
return options.timestamp() + ' [' + options.level.toUpperCase() + '] ' + uuid() + ' ' + (undefined !== options.message ? options.message : '') +
(options.meta && Object.keys(options.meta).length ? JSON.stringify(options.meta) : '');
}
winston.remove(winston.transports.Console);
winston.add(winston.transports.File,
{
timestamp: function () {
return moment().format();
},
json: false,
filename: today + '/test.log',
formatter: customFileFormatter
}
);
module.exports = function (req, res, next) {
next()
};
In any file
var logger = require('winston');
logger.info("First Log");
logger.info("Second Log");
Output is
2017-02-24T18:51:39+05:30 [INFO] 2cf92c90-fa94-11e6-83ba-ebaf5a4e7acd First Log
2017-02-24T18:51:39+05:30 [INFO] 2cf9c8d0-fa94-11e6-83ba-ebaf5a4e7acd Second Log