自定义控制台日志功能,一个console.log包装器

Joh*_*ohn 15 javascript debug-backtrace

function log( msgOrObj ){
    if(dev_mode){
        console.log({
            'message': msgOrObj,
            'caller': arguments.callee.caller.toString()
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我试图编写一个简单的自定义控制台日志功能(如上所述).但是我很难找到调用者来自哪个文件和行.我能看到的最多就是调用它的函数.

有没有人做过类似的事情?或者这甚至可能吗?

第70行的somescript.js中使用的示例:

log('some very important message!')
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 5

是的,但它非常hacky 并且不跨浏览器安全。您可以以此为起点。它借鉴了这个答案

window.trace = function stackTrace() {
    var err = new Error();
    return err.stack;
}

window.my_log = function (x) {
    var line = trace();
    var lines = line.split("\n");
    console.log(x + " " + lines[2].substring(lines[2].indexOf("("), lines[2].lastIndexOf(")") + 1))
}


window.my_log("What light through yonder window breaks?")
Run Code Online (Sandbox Code Playgroud)

产生:

What light through yonder window breaks? (<anonymous>:2:42) 
Run Code Online (Sandbox Code Playgroud)


小智 2

所以,这就是我最终想要的(其中shout是一个仅在开发模式下运行的定制函数):

function log( msgOrObj ){
    if(dev_mode){
        if( typeof(window.console) != 'undefined' ){
            try {  invalidfunctionthrowanerrorplease(); }
            catch(err) {  var logStack = err.stack;  }
            var fullTrace = logStack.split('\n');
            for( var i = 0 ; i < fullTrace.length ; ++i ){
                fullTrace[i] = fullTrace[i].replace(/\s+/g, ' ');
            }
            var caller = fullTrace[1],
                callerParts = caller.split('@'),
                line = '';

            //CHROME & SAFARI
            if( callerParts.length == 1 ){
                callerParts = fullTrace[2].split('('), caller = false;
                //we have an object caller
                if( callerParts.length > 1 ){
                    caller = callerParts[0].replace('at Object.','');
                    line = callerParts[1].split(':');
                    line = line[2];
                }
                //called from outside of an object
                else {
                    callerParts[0] = callerParts[0].replace('at ','');
                    callerParts = callerParts[0].split(':');
                    caller = callerParts[0]+callerParts[1];
                    line = callerParts[2];
                }
            }
            //FIREFOX
            else {
                var callerParts2 = callerParts[1].split(':');
                line = callerParts2.pop();
                callerParts[1] = callerParts2.join(':');
                caller = (callerParts[0] == '') ? callerParts[1] : callerParts[0];
            }
            console.log( ' ' );
            console.warn( 'Console log: '+ caller + ' ( line '+ line +' )' );
            console.log( msgOrObj );
            console.log({'Full trace:': fullTrace });
            console.log( ' ' );
        } else {
            shout('This browser does not support console.log!')
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

log() 在应用程序的其余部分之前声明时,可以在应用程序内的任何位置调用,并为开发人员提供所需的所有信息,而且不会退出开发模式。

http://webconfiguration.blogspot.co.uk/2013/12/javascript-console-log-wrapper-with.html