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

Ste*_*ter 5 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");
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

编辑:

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

Wil*_*osa 4

我想到的第一件事是创建一个新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");
Run Code Online (Sandbox Code Playgroud)

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