Как добыть номера строк из журнала консоли - PullRequest
0 голосов
/ 03 октября 2018

Я бы хотел сохранить выходные данные консоли без изменений (сохранить номер файла и строки), но хотел бы захватить номер файла и строки и сохранить их для анализа.

Наиболее близким решением, которое я нашел, является этот код изответ Бретта Замира на этот вопрос .

(function () {
  'use strict';
  var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
  var isChrome = !!window.chrome && !!window.chrome.webstore;
  var isIE = /*@cc_on!@*/false || !!document.documentMode;
  var isEdge = !isIE && !!window.StyleMedia;
  var isPhantom = (/PhantomJS/).test(navigator.userAgent);
  Object.defineProperties(console, ['log', 'info', 'warn', 'error'].reduce(function (props, method) {
    var _consoleMethod = console[method].bind(console);
    props[method] = {
      value: function MyError () {
        var stackPos = isOpera || isChrome ? 2 : 1;
        var err = new Error();
        if (isIE || isEdge || isPhantom) { // Untested in Edge
          try { // Stack not yet defined until thrown per https://docs.microsoft.com/en-us/scripting/javascript/reference/stack-property-error-javascript
            throw err;
          } catch (e) {
            err = e;
          }
          stackPos = isPhantom ? 1 : 2;
        }

        var a = arguments;
        if (err.stack) {
          var st = err.stack.split('\n')[stackPos]; // We could utilize the whole stack after the 0th index
          var argEnd = a.length - 1;
          [].slice.call(a).reverse().some(function(arg, i) {
            var pos = argEnd - i;
            if (typeof a[pos] !== 'string') {
              return false;
            }
            if (typeof a[0] === 'string' && a[0].indexOf('%') > -1) { pos = 0 } // If formatting
            a[pos] += ' \u00a0 (' + st.slice(0, st.lastIndexOf(':')) // Strip out character count
              .slice(st.lastIndexOf('/') + 1) + ')'; // Leave only path and line (which also avoids ":" changing Safari console formatting)
            return true;
          });
        }
        return _consoleMethod.apply(null, a);
      }
    };
    return props;
  }, {}));
}());

Я мог бы получить эти значения, заменив строку

a[pos] += ' \u00a0 (' + st.slice(0, st.lastIndexOf(':')) // Strip out character count
              .slice(st.lastIndexOf('/') + 1) + ')'; // Leave only path and line (which also avoids ":" changing Safari console formatting)

на

my_log+=st.slice(0, st.lastIndexOf(':')).slice(st.lastIndexOf('/') + 1)

Но я не смог найти способ сохранить консоль в целости и сохранности.Имя файла и номер строки (справа) в консоли изменяются на номер строки return _consoleMethod.apply(null, a);

Аналогичные результаты как в Firefox, так и в Chrome.

Насколько я могу судить,как только вы наберете value:MyError function(){, исходный вывод консоли будет утерян.

Есть ли способ выполнить то, что я хочу?

...