Как получить доступ к номерам строк при переносе Firebug (или аналогичного) консоли API - PullRequest
9 голосов
/ 26 июля 2010

Я обернул консольный API, чтобы обеспечить детализированные уровни ведения журналов, а также несколько других функций сахара.

Это работает нормально, единственная проблема в том, что firebug (или любая другая консоль) всегда будет сообщать номер строки, из которой поступил журнал, как строку, в которой вызывается сам API консоли.

Как бы вы посоветовали мне записать в консоли номер строки, с которой я вызываю свою функцию-обертку?

Я бы предпочел кросс-браузерное решение, но если плагин firebug мог бы быть хорошим началом, то это было бы неплохо.

Кстати, я называю свою функцию регистрации следующим образом:

db.log(db.LogLevel.WARN, "Blah Blah Blah");

Ответы [ 5 ]

3 голосов
/ 13 декабря 2010

Интересная проблема ... У меня может быть взлом для вас.Сейчас я не могу проверить это, но думаю, что это может сработать.

Мы знаем, что обычный вызов функции не сработает, поэтому я начал думать о #defines в C и макросах в различных других языках.К сожалению, в javascript этого нет, но возможно, eval взлом будет работать .Я ожидаю, что eval будет запускать код, как если бы он пришел из той же строки - если нет, блеф, проигнорируйте остальную часть этого ответа.

Мой метод работает так:

  1. Измените вашу функцию db.log так, чтобы она указала на eval (да, ew)
  2. Вместо того, чтобы передавать свои LogLevels в качестве аргумента, создайте функции для каждого из них, которые возвращают строку с console.log в нем и в специальном сообщении.

Это должно выглядеть примерно так:

db = {LogLevel: {}};
db.log = eval;
db.LogLevel.warn = function(message) {
   return "console.log('THIS IS A WARNING: " + message + "');";
};

Вы должны иметь возможность вызывать его вот так:

db.log(db.LogLevel.warn("Blah blah blah"));
1 голос
/ 09 мая 2013
//trust me, this way rocks!  Auto prepend a logHead, yet keep correct line number displayed debug view.
//Output sample:
//  5/10 1:13:52.553  hi                                    a.js:100
//  5/10 1:13:52.553  err                                   b.js:200

    var Log = {
        debug : true,

        /*
         * log.d(logData1, logData2, ...)
         *  --> console.log( getLogHead(), logData1, logData2, ...)
         * 
         * @comment Using bind and property accesser
         * @see http://ejohn.org/blog/javascript-getters-and-setters/
         */
        get d() { 
            if ( !this.debug) return _emptyFunc;
            return console.log.bind( console, this._getLogHeader() );
        },

        /*
         * output error info
         */
        get e() { 
            return console.error.bind( console, this._getLogHeader() );
        },

        /**
         * get current time in 01/31 23:59:59.999 format
         */
        _getLogHeader : function () {

            var millisec = Date.now();
            this._dtNow.setTime( millisec );
            //toLocaleString is 2013/01/31 23:59:59
            return this._dtNow.toLocaleString().slice( 5 ) + '.' + ('000' + millisec).slice( -3 ) + ' ';
        },
        _dtNow: new Date(),
        _emptyFunc: function() {}
    };


    //enjoy it !
        Log.d('hi');
        Log.e('err');
0 голосов
/ 14 августа 2013

Вот два способа обернуть логи без потери контекста. Первое немного некрасиво со стороны звонящего. Второй можно использовать только в том случае, если вам не нужны подробности того, что было зарегистрировано.

См. JSFiddle для демонстрации: http://jsfiddle.net/epQ95/1/

// logger method 1: allows for fully functional log-wrapping without losing context,
//                  but, it is very ugly from the caller's perspective.
var debug = function () {
    // do my extra special stuff
    window.console.log("logging to server 1: ", arguments);

    // do regular console logging, if possible
    if (window.console && window.console.log) {
        return window.console.log.apply.bind(window.console.log, window.console, arguments);
    } else {
        return function () {};
    }
};

// caller
debug("logger method", 1)();

// logger method 2: pretty calling, but you don't know what was logged,
//                  just that something definitely was.
var Logger = {};
Logger.__defineGetter__("debug", function () {
    // do my extra special stuff
    window.console.log("logging to server 2: don't know what was logged");

    // do regular console logging, if possible
    if (window.console && window.console.log) {
        return console.log.bind(window.console);
    } else {
        return function () {};
    }
});

// caller
Logger.debug("logger method", 2);
0 голосов
/ 30 августа 2012

Так что это недавно появилось снова, поэтому я решил вернуться к нему.

Теперь я старше и мудрее, и для меня очевидно, что гораздо лучшее решение, чем то, что я пытался сделать, - это вызывать консольные функции такими, какие они есть, но выборочно заменять их фиктивными функциями, когда уровень понижается.,Это дает мне мелкозернистое ведение журнала и точную отчетность по номеру строки.Некоторые функции были потеряны из моего предыдущего решения, но я думаю, что это приемлемый компромисс.

Вот частичный фрагмент моей новой библиотеки журналирования, которая показывает основное решение

...
levels : ["debug","info","warn","error"],

    init : function(minLevel) {
        var params = abm.getUrlParams();
        minLevel = params["debug"] || minLevel;

        //TODO: firebug lite
        window.console = window.console || {};

        var clear = false;
        for (var i=0; i<self.levels.length; i++) {
            var level = self.levels[i];
            originalFunctions[i] = originalFunctions[i] 
            || console[level] || fallback;

            if (level && (clear || level===minLevel)) {
                console[level] = originalFunctions[i];
                clear=true;
            } else {
                console[level] = suppressed(level);
            }
        }

    }
...

Вы можетесмотрите полную информацию здесь: https://github.com/antiBaconMachine/abm-log

0 голосов
/ 06 ноября 2010

Обычно использование функций debug () или error () вместо log () приводит к отображению номеров строк. Я считаю, что консоль Google Chrome работает аналогично. ( ссылка на firebug )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...