Javascript 自定义日志如何运行打印行号(&P);调用它的文件名

Javascript 自定义日志如何运行打印行号(&P);调用它的文件名,javascript,Javascript,我制作了以下自定义日志功能来打印所有控制台日志消息。使用此功能,我可以通过单个标志变量控制整个应用程序中的打印或不打印日志 var Utilities = { showLogs: true, printLog: function (msg) { if (this.showLogs) { console.log(msg); } } }; 我称之为: Utilities.printLog("a message to p

我制作了以下自定义日志功能来打印所有控制台日志消息。使用此功能,我可以通过单个标志变量控制整个应用程序中的打印或不打印日志

var Utilities = {
    showLogs: true,
    printLog: function (msg) {
        if (this.showLogs) {
            console.log(msg);
        }
    }
};
我称之为:

Utilities.printLog("a message to print on console");
它工作正常。但它有一个局限性,即它没有显示正确的行号和文件名,而这是用来打印日志的

一种解决方案是提供额外的参数来打印行号和文件名以及消息

例如:

我不想要这些额外的参数,我想知道是否还有其他选择

更新:

我尝试了V8的堆栈跟踪API,但它只在try-catch块中生成异常时才有帮助

首先覆盖错误。prepareStackTrace并创建如下跟踪函数:

Error.prepareStackTrace = function(error, stack) {
    return stack;
};

function getTrace(e) {
    var stack = e.stack;
    var trace = ""; 
    for (var i = 0; i < stack.length; i++) {                   
         trace += "\r" + stack[i];
     }
    return trace;
}
mathLib.js

var libObj = {
    getCube: function(x){
        return mathLib.cube( x ); 
    }
};
var mathLib = {
    cube: function(x){
        return evilObj * x * x; //see the undefined evilObj --- lets catch trace here
    }
};
现在,从第三个js文件(或者在HTML文件中)调用try-catch块中的函数,查看易受攻击代码的精确跟踪

<script type="text/javascript">
      try {
            var results;
            results = libObj.getCube(2);
            console.log( results );

        } catch (e) {              
            console.log( getTrace(e));
        }
</script>

试一试{
var结果;
结果=libObj.getCube(2);
控制台日志(结果);
}第(e)款{
console.log(getTrace(e));
}
现在,我得到以下易受攻击代码的跟踪:

注意:-如果您没有覆盖错误。prepareStackTrace,那么它会给出非常格式化的跟踪…尽管两者都有相同的信息

没有覆盖错误。prepareStackTrace

现在问题仍然悬而未决,我如何为我的自定义日志函数捕获类似的跟踪,如上所述。

您可以这样做:

var Utilities=
{
    showLogs:true,
    printLog:function(msg){
        if(!this.showLogs) return 0;
        var k=new Error().stack.split("\n").slice(2);
        k.unshift(msg);
        console.log(k.join("\n"));
    }
}

您可能想看看堆栈跟踪API:。让我检查一下,谢谢。检查一下:这个呢?感谢这两个链接。我刚刚阅读了这两个链接,但不幸的是,它们引用了Try/catch/error处理方法。我正在尝试一个正常的日志,没有例外,也没有使用try/catch。。。只是普通日志声明。谢谢,它给了我一个想法,并根据我的需要对其进行了修改。@AAhad我很乐意提供帮助。
var Utilities=
{
    showLogs:true,
    printLog:function(msg){
        if(!this.showLogs) return 0;
        var k=new Error().stack.split("\n").slice(2);
        k.unshift(msg);
        console.log(k.join("\n"));
    }
}