【问题标题】:javascript: console log use parent scopejavascript:控制台日志使用父范围
【发布时间】:2015-11-22 00:35:20
【问题描述】:

是否可以使用一些 javascript 技巧来告诉 console.log 它应该输出哪个行号?

假设,我们下面这个简单的例子:

function Logger () {
    this.debug = function(msg) {
        // do some stuff with msg
        console.log(msg);
    };
}

var log = new Logger();
log.debug("Hello");

如果您打开该页面,Chrome 会显示以下内容:

这表明该消息记录在main.js:4,但我真正想要的是它显示main.js:9。因为第 9 行是调用记录器的位置。 对于这个简单的情况,它并没有太大的区别,但是当 Logger 在一个单独的文件中时,它总是显示 logger.js 而不是调用 logger 的类。

Logger 类应该对记录的消息做一些额外的事情(例如,将其发送到服务器),因此我不能只使用this.debug = console.log

编辑

已经有一些类似的问题了,不过都是在输出中多加了一行,不能点击跳转到对应的行:

【问题讨论】:

    标签: javascript logging


    【解决方案1】:

    我首先想到的是创建一个新的Error 对象来获取堆栈跟踪,然后找到调用您的方法的行,如下所示:

    function Logger () {
        this.debug = function(msg) {
            // do some stuff with msg
    
            //TODO: document this line
            var callerLine = new Error().stack.split('\n')[2];
            console.log(msg, callerLine);
        };
    }
    
    var log = new Logger();
    log.debug("Hello");
    

    基本上,我在每个换行符中拆分错误堆栈,并忽略第一行和第二行(分别是错误消息和您自己在堆栈中的方法)。

    【讨论】:

    • 这是一个还不完美的解决方案。现在的输出是:Hello at http://localhost/main.js:12:5 main.js:7 最好只有相对路径。
    • 不幸的是 Error.prototype.stack 属性不符合标准,所以这不是一个有效的解决方案。见:developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
    • 这段代码甚至不适合在生产环境中工作,因为你的 JS 应该被缩小,以尽可能少的行来适应所有内容。这并不意味着是跨浏览器的事情,只是一种简化日志记录的方法,所以我不明白不作为标准如何使它成为“无效的解决方案”
    • 好吧,问题是我正在使用 Typescript,它在这一行抱怨 TS2339: Property 'stack' does not exist on type 'Error'.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2020-03-09
    • 1970-01-01
    • 2011-10-11
    • 2011-03-28
    • 2019-08-05
    相关资源
    最近更新 更多