index.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. var util = require('util');
  2. var LogDriver = function(options){
  3. options = options || {};
  4. var logger = this;
  5. if (options.format){
  6. this.format = options.format;
  7. }
  8. this.levels = options.levels || ['error', 'warn', 'info', 'debug', 'trace'];
  9. if (options.level === false){
  10. this.level = false; // don't log anything
  11. } else {
  12. this.level = options.level || this.levels[this.levels.length - 1];
  13. if (this.levels.indexOf(this.level) === -1){
  14. throw new Error("Log level '" +
  15. this.level +
  16. "' does not exist in level list '" + JSON.stringify() + "'");
  17. }
  18. }
  19. this.levels.forEach(function(level){
  20. if (logLevelShouldOutput(level, logger.level, logger.levels)){
  21. logger[level] = function(){
  22. var args = Array.prototype.slice.call(arguments);
  23. args.unshift(level); // log level is added as the first parameter
  24. console.log(logger.format.apply(logger, args));
  25. };
  26. } else {
  27. logger[level] = function(){/* no-op, because this log level is ignored */};
  28. }
  29. });
  30. };
  31. var logLevelShouldOutput = function(logLevel, configuredLevel, levels){
  32. if (configuredLevel === false){
  33. return false;
  34. }
  35. return (levels.indexOf(logLevel) <= levels.indexOf(configuredLevel));
  36. };
  37. LogDriver.prototype.format = function(){
  38. var args = Array.prototype.slice.call(arguments, [1]); // change arguments to an array, but
  39. // drop the first item (log level)
  40. var out = "[" + arguments[0] + "] " + JSON.stringify(new Date()) + " ";
  41. args.forEach(function(arg){
  42. out += " " + util.inspect(arg);
  43. });
  44. return out;
  45. };
  46. var defaultLogger = null;
  47. var factory = function(options){
  48. defaultLogger = new LogDriver(options);
  49. factory.logger = defaultLogger;
  50. return defaultLogger;
  51. };
  52. factory();
  53. module.exports = factory;