javascript - 自定义日志功能如何打印行号和调用它的文件名

标签 javascript

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

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

我称之为:

Utilities.printLog("a message to print on console");

它按预期工作正常。但它有一个限制,即它没有显示正确的行号和调用它来打印日志的文件名。

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

例如:

Utilities.printLog("a message to print on console", "10","common.js");
Utilities.printLog("a message to print on console", "310","myLib.js");

想要这些额外参数,想知道是否还有其他可用选项。

更新:

我尝试了 V8 的 Stack Trace API http://code.google.com/p/v8/wiki/JavaScriptStackTraceApi但它仅在 try catch block 内生成异常时有用

首先覆盖 Error.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;
}

并创建了两个示例 js 文件。

libObj.js

var libObj = {
    getCube: function(x){
        return mathLib.cube( x ); 
    }
};

ma​​thLib.js

var mathLib = {
    cube: function(x){
        return evilObj * x * x; //see the undefined evilObj --- lets catch trace here
    }
};

现在我从第三个 js 文件(或者在我的例子中是在 HTML 文件中)调用 try catch block 中的函数来查看易受攻击代码的精确跟踪。

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

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

现在我得到了易受攻击代码的踪迹:

enter image description here

注意:- 如果您不覆盖 Error.prepareStackTrace,那么它会提供我认为格式良好的跟踪...尽管两者具有相同的信息。

没有覆盖Error.prepareStackTrace: enter image description here

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

最佳答案

你可以这样做:

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"));
    }
}

关于javascript - 自定义日志功能如何打印行号和调用它的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26964005/

相关文章:

javascript - 我网站上的 Twitter 关注按钮 - Flash 的无样式内容

javascript - Js倒计时文本不在边框中心内

javascript - SweetAlert 配置困惑

javascript - 大约 5500 个链接可以最大程度地减少页面速度下降的有效方法是什么

javascript - 使用 noConflict 方法后下划线未定义

javascript - 使用 html 标签和 bootstrap 时,为什么文本出现在我的 Shiny 应用程序中

javascript - 如何直接从 url 访问 JSON 数组

javascript - 我可以拒绝从 oninput 绑定(bind)捕获的输入吗?

javascript - AngularJs $http 在页面加载时发布

javascript - mocha-casperjs headless 测试 : document. 包含未定义