code: function(obj, callback) {
        if (!obj.msg) {
          var errorMsg = "Object argument must contain the property 'msg'";
          this.logger(errorMsg);
          if (callback) {
            callback(new Error(errorMsg));
          }
          
          return;
        }
        
        var k;
        var level = obj.level || 'info';
        var item = {
          level: level,
          body: {
            message: { body: obj.msg }
          }
        };
        if (obj._fingerprint) {
          item.fingerprint = obj._fingerprint;
        }
        
        // add other keys to body.message
        for (k in obj) {
          if (obj.hasOwnProperty(k) && k !== 'level' && k !== 'msg' && k !== '_fingerprint') {
            item.body.message[k] = obj[k];
          }
        }
        
        if (callback) {
          item.callback = callback;
        }
        
        this.items.push(item);
        this.handleEvents();
      }
docs: obj should be an object with the following keys. only 'msg' is required. msg: the message string level: one of ['critical', 'error', 'warning', 'info', 'debug'] (defaults to 'info') can also contain any additional arbitrary keys, which will be included as well.