docs: function (options) {
  
          // Private variables
  
          var self = this,
  
              level = options && options.level,
  
              sinks = (options && options.sinks) || {console: consoleSink},
  
          // Protected methods
  
              log = function () {
                  var timestamp = (new Date()).toISOString(),
                      level = arguments[0] && arguments[0].toUpperCase(),
                      args = Array.prototype.slice.call(arguments, 1),
                      requestId = getRequestId(),
                      columns = [timestamp, level, requestId, formatter.apply(self, args)],
                      message = columns.join('\t');
  
                  for (var sink in sinks) {
                      if (sinks.hasOwnProperty(sink)) {
                          (function (sink) {
                              setTimeout(function () {
                                  sinks[sink] && sinks[sink](message);
                              }, 0);
                          }(sink));
                      }
                  }
  
                  return message;
              },
  
              debugLog = function () {
                  return log.apply(self, unshift(arguments, LogLevels.DEBUG));
              },
  
              errorLog = function () {
                  return log.apply(self, unshift(arguments, LogLevels.ERROR));
              },
  
              infoLog = function () {
                  return log.apply(self, unshift(arguments, LogLevels.INFO));
              },
  
              warnLog = function () {
                  return log.apply(self, unshift(arguments, LogLevels.WARN));
              };
  
          // Public methods
  
          self.addSink = function (name, instance) {
              if (typeof name !== 'string' || typeof instance !== 'function') {
                  throw new TypeError();
              }
  
              sinks[name] = instance;
          };
  
          self.consoleSink = consoleSink;
  
          self.getLevel = function () {
              return level;
          };
  
          self.getSinks = function () {
              return sinks;
          };
  
          self.removeSink = function (name) {
              if (sinks[name]) {
                  delete sinks[name];
              }
          };
  
          self.setLevel = function (newLevel) {
              switch (newLevel) {
                  case LogLevels.DEBUG:
                      self[LogLevels.DEBUG] = debugLog;
                      self[LogLevels.ERROR] = errorLog;
                      self[LogLevels.INFO] = infoLog;
                      self[LogLevels.WARN] = warnLog;
                      break;
                  case LogLevels.ERROR:
                      self[LogLevels.DEBUG] = noop;
                      self[LogLevels.INFO] = noop;
                      self[LogLevels.WARN] = noop;
                      self[LogLevels.ERROR] = errorLog;
                      break;
                  case LogLevels.INFO:
                      self[LogLevels.DEBUG] = noop;
                      self[LogLevels.INFO] = infoLog;
                      self[LogLevels.WARN] = warnLog;
                      self[LogLevels.ERROR] = errorLog;
                      break;
                  case LogLevels.WARN:
                      self[LogLevels.DEBUG] = noop;
                      self[LogLevels.INFO] = noop;
                      self[LogLevels.WARN] = warnLog;
                      self[LogLevels.ERROR] = errorLog;
                      break;
                  default:
                      return self.setLevel(LogLevels.ERROR);
              }
  
              infoLog('[common.logger.setLevel] Changing logging level to %s', newLevel);
  
              return level = newLevel;
          };
  
          // Init
  
          self.setLevel(level);
      }