function asJson$1 (obj, msg, num, time) {
  const stringify = this[stringifySym$2];
  const stringifySafe = this[stringifySafeSym$1];
  const stringifiers = this[stringifiersSym$2];
  const end = this[endSym$1];
  const chindings = this[chindingsSym$2];
  const serializers = this[serializersSym$2];
  const formatters = this[formattersSym$3];
  const messageKey = this[messageKeySym$1];
  const errorKey = this[errorKeySym$2];
  let data = this[lsCacheSym$2][num] + time;

  // we need the child bindings added to the output first so instance logged
  // objects can take precedence when JSON.parse-ing the resulting log line
  data = data + chindings;

  let value;
  if (formatters.log) {
    obj = formatters.log(obj);
  }
  const wildcardStringifier = stringifiers[wildcardFirstSym];
  let propStr = '';
  for (const key in obj) {
    value = obj[key];
    if (Object.prototype.hasOwnProperty.call(obj, key) && value !== undefined) {
      if (serializers[key]) {
        value = serializers[key](value);
      } else if (key === errorKey && serializers.err) {
        value = serializers.err(value);
      }

      const stringifier = stringifiers[key] || wildcardStringifier;

      switch (typeof value) {
        case 'undefined':
        case 'function':
          continue
        case 'number':
          /* eslint no-fallthrough: "off" */
          if (Number.isFinite(value) === false) {
            value = null;
          }
        // this case explicitly falls through to the next one
        case 'boolean':
          if (stringifier) value = stringifier(value);
          break
        case 'string':
          value = (stringifier || asString)(value);
          break
        default:
          value = (stringifier || stringify)(value, stringifySafe);
      }
      if (value === undefined) continue
      propStr += ',"' + key + '":' + value;
    }
  }

  let msgStr = '';
  if (msg !== undefined) {
    value = serializers[messageKey] ? serializers[messageKey](msg) : msg;
    const stringifier = stringifiers[messageKey] || wildcardStringifier;

    switch (typeof value) {
      case 'function':
        break
      case 'number':
        /* eslint no-fallthrough: "off" */
        if (Number.isFinite(value) === false) {
          value = null;
        }
      // this case explicitly falls through to the next one
      case 'boolean':
        if (stringifier) value = stringifier(value);
        msgStr = ',"' + messageKey + '":' + value;
        break
      case 'string':
        value = (stringifier || asString)(value);
        msgStr = ',"' + messageKey + '":' + value;
        break
      default:
        value = (stringifier || stringify)(value, stringifySafe);
        msgStr = ',"' + messageKey + '":' + value;
    }
  }

  if (this[nestedKeySym$1] && propStr) {
    // place all the obj properties under the specified key
    // the nested key is already formatted from the constructor
    return data + this[nestedKeyStrSym$1] + propStr.slice(1) + '}' + msgStr + end
  } else {
    return data + propStr + msgStr + end
  }
}
A code indicating that the action was a failure