Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript:控制台日志使用父作用域_Javascript_Logging - Fatal编程技术网

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

javascript:控制台日志使用父作用域,javascript,logging,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会显示以下内容: 这

是否可以使用一些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.js
,而不是调用记录器的类

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

编辑:

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


我想到的第一件事是创建一个新的
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 athttp://localhost/main.js:12:5       main.js:7
最好只使用相对路径。不幸的是,Error.prototype.stack属性不符合标准,因此这不是有效的解决方案。请参阅:这段代码甚至不适合在生产环境中使用,因为您的JS应该被缩小,尽可能用最少的行来容纳所有内容。这并不是一个跨浏览器的东西,只是一种简化日志记录的方法,所以我不认为这是一个“无效的解决方案”,问题是我使用的是Typescript,它在这一行抱怨
TS2339:Property'stack'在type'Error'上不存在。