Source: Logger.js

/**
 * A Simple Logger with levels
 * @module
 * @author Kevin Smithson <ksmithson@sazze.com>
 */

var Logger = module.exports = {
  /**
   * A debug log
   *
   * @param {string} message the message
   * @param {mixed} [...] arguments to pass to log
   */
  debug: function() {
    log.call(this, levels.debug, '\x1B[36m[debug]\x1B[39m ', arguments);
  },

  /**
   * A info log
   *
   * @param {string} message the message
   * @param {mixed} [...] arguments to pass to log
   */
  info: function() {
    log.call(this, levels.info, '\x1B[32m[info]\x1B[39m ', arguments);
  },

  /**
   * A verbose log
   *
   * @param {string} message the message
   * @param {mixed} [...] arguments to pass to log
   */
  verbose: function() {
    log.call(this, levels.verbose, '\x1B[35m[verbose]\x1B[39m ', arguments);
  },

  /**
   * A error log
   *
   * @param {string} message the message
   * @param {mixed} [...] arguments to pass to log
   */
  error: function() {
    log.call(this, levels.error, '\x1B[31m[error]\x1B[39m ', arguments);
  },

  /**
   * Set the level to use
   *
   * @param {int} logLevel the level of the log
   */
  set level(logLevel) {
    "use strict";
    level = logLevel;
  },

  /**
   * get the log level
   *
   * @returns {number}
   */
  get level() {
    "use strict";
    return level;
  }
}

/**
 * The levels of logs
 * @type {{verbose: number, debug: number, info: number, error: number, noLog: number}}
 */
var levels = {
  verbose: 10,
  debug: 7,
  info: 5,
  error: 1,
  noLog: 0
};

// Set default level to error
var level = levels.error;

// expose the available levels
Logger.levels = levels;

/**
 * The internal log function
 *
 * @private
 * @param {int} logLevel the log level that is allowed
 * @param prefix the prefix that gets prepended to the message
 * @param args and object of arguments, usually from global [arguments]
 */
function log(logLevel, prefix, args) {
  "use strict";
  if (logLevel > level) {
    return;
  }

  args = Array.prototype.slice.call(args);

  if (typeof args[0] === 'undefined') {
    return;
  }

  var message = args[0];
  args.splice(0, 1, prefix + message);

  console.log.apply(this, args);
}