'use strict'; | |
var util = require('util'), | |
winston = require('winston'), | |
logger = new winston.Logger(), | |
production = (process.env.NODE_ENV || '').toLowerCase() === 'production'; | |
module.exports = { | |
middleware: function(req, res, next){ | |
console.info(req.method, req.url, res.statusCode); | |
next(); | |
}, | |
production: production | |
}; | |
// Override the built-in console methods with winston hooks | |
switch((process.env.NODE_ENV || '').toLowerCase()){ | |
case 'production': | |
production = true; | |
logger.add(winston.transports.File, { | |
filename: __dirname + '/application.log', | |
handleExceptions: true, | |
exitOnError: false, | |
level: 'warn' | |
}); | |
break; | |
case 'test': | |
// Don't set up the logger overrides | |
return; | |
default: | |
logger.add(winston.transports.Console, { | |
colorize: true, | |
timestamp: true, | |
level: 'info' | |
}); | |
break; | |
} | |
function formatArgs(args){ | |
return [util.format.apply(util.format, Array.prototype.slice.call(args))]; | |
} | |
console.log = function(){ | |
logger.info.apply(logger, formatArgs(arguments)); | |
}; | |
console.info = function(){ | |
logger.info.apply(logger, formatArgs(arguments)); | |
}; | |
console.warn = function(){ | |
logger.warn.apply(logger, formatArgs(arguments)); | |
}; | |
console.error = function(){ | |
logger.error.apply(logger, formatArgs(arguments)); | |
}; | |
console.debug = function(){ | |
logger.debug.apply(logger, formatArgs(arguments)); | |
}; |
helpful
line 44 - >
logger.info.apply(logger, formatArgs(arguments));
should be (?) ->
logger.log.apply(logger, formatArgs(arguments));
awesome, thanks!
The code is right. I've tried your suggestion and it doesn't work.
This is a very useful idea because it allows you to program as you normally would in debug mode yet override logging in production so that it isn't synchronous. Simple and good.
Simple ES6 syntax :)
console.log = (...args) => logger.info.call(logger, ...args);
console.info = (...args) => logger.info.call(logger, ...args);
console.warn = (...args) => logger.warn.call(logger, ...args);
console.error = (...args) => logger.error.call(logger, ...args);
console.debug = (...args) => logger.debug.call(logger, ...args);
This is helpful! Thanks!
Thanks @fega!
@fega surely it could be more simple, the .call
seems redundant.
console.log = (...args) => logger.info(...args);
// etc
@spmason thanks for the great simple reference here!
@fega much easier to read, but important to note that it's not semantically equivalent to normal syntax; binds this
to current scope which could or might cause people unfamiliar to get confused or have debugging problems somewhere (if they want to override with any other logic as well). Not to say it's bad, just pointing out in case somebody is bashing their head on the keyboard somewhere one day :)
Thanks for the info everyone.
@spmason and @fega -- I've quoted your answers in this stackoverflow answer, and marked it as a community wiki since I did not write the answers myself. Cheers.
tnks
Can i override logger level default methods, actually i want to save all logger.error msgs in mongo
Took a stab at an updated version with color support: https://gist.github.com/BinaryShrub/790d97e34247d409f85b7c9434d0ddd5
thx!