docs: function log(method, logger, opts) {
    var decorated = function logDecorator() {
      var methodName = opts.methodName;
      var params = opts.params;
      var removeOutput = opts.removeOutput;
      var logExit = function logExit(output, id) {
        var formattedOutput = removeOutput ? '<removed>' : _serializeObject(output);
        logger.debug({ id: id }, ' EXIT ' + methodName + ':', formattedOutput);
        return output;
      };
      var id = ++_seqId;
  
      for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
      }
  
      var formattedInput = params.length ? _serializeObject(_combineObject(params, args)) : '{ }';
      logger.debug({ id: id }, 'ENTER ' + methodName + ':', formattedInput);
      var result = void 0;
  
      try {
        result = method.apply(undefined, args);
      } catch (e) {
        logger.error(e);
        throw e;
      }
      // promise (or async function)
      if (result && _lodash2.default.isFunction(result.then)) {
        return result.then(function (asyncResult) {
          logExit(asyncResult, id);
          return asyncResult;
        }).catch(function (e) {
          logger.error({ id: id }, 'ERROR ' + methodName + ': ' + formattedInput + ' \n', e);
          throw e;
        });
      }
      logExit(result, id);
      return result;
    };
    return _keepProps(method, decorated);
  }