时间:2010-07-26 15:28:05

标签: javascript logging console firebug line-numbers

5 个答案:

答案 0 :(得分:3)

有趣的问题......我可能会为你做一个黑客攻击。我现在无法测试,但我认为它可能有用。

我们知道常规函数调用不起作用,所以我开始考虑C中的#defines和其他各种语言的宏。不幸的是,javascript没有这个,但也许eval黑客可以使用。我期待eval将运行代码,就好像它来自同一行 - 如果不是,那么,请忽略此答案的其余部分。

我的方法是这样的:

  1. 将db.log函数更改为指向eval(是,否)
  2. 不是将LogLevels作为参数传递,而是为每个返回一个返回字符串console.log的函数和自定义消息创建函数。
  3. 看起来应该是这样的:

    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 :(得分:1)

//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');

答案 2 :(得分:0)

通常使用debug()或error()而不是log()函数将导致显示行号。我相信Google Chrome控制台的工作方式与此类似。 (firebug reference

答案 3 :(得分:0)

所以这最近又出现了,所以我决定再次访问它。

现在我已经老了,更聪明了我更清楚一个更好的解决方案然后我想要做的就是按原样调用控制台功能,但在关闭电平时选择性地用虚拟功能替换它们。这为我提供了精细的记录和准确的行号报告。我以前的解决方案已经失去了一些功能,但我认为这是一个可接受的妥协。

这是我的新日志文件库的部分剪辑,它显示了主要的解决方案

...
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

答案 4 :(得分:0)

以下两种方法可以在不丢失上下文的情况下包装日志。第一个是来自呼叫方的有点难看。第二个仅在您不需要记录内容的详细信息时才可用。

请参阅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);