javascript:控制台日志使用父作用域

时间:2015-08-27 14:46:37

标签: javascript logging

是否可以使用一些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会显示以下内容:

enter image description here

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

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

修改

已经有一些类似的问题,但是所有这些问题都只是在输出中添加了一条额外的行,而这些行无法点击以跳转到相应的行:

1 个答案:

答案 0 :(得分: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");

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