美文网首页我爱编程Java 核心技术JavaScript 进阶营
console.log输出打印日志所在代码行数

console.log输出打印日志所在代码行数

作者: 宛丘之上兮 | 来源:发表于2018-07-26 19:30 被阅读3次

    nodejs怎么显示console.log所对应的打印日志的代码的行数呢?今天google了很长时间,总算找到了一个自己比较满意的解决方案。话不多说,直接上代码:

    var getStackTrace = function () {
      var obj = {};
      Error.captureStackTrace(obj, getStackTrace);
      return obj.stack;
    };
    var log = console.log;
    console.log = function () {
      var stack = getStackTrace() || ""
      var matchResult = stack.match(/\(.*?\)/g) || []
      var line = matchResult[1] || ""
      for (var i in arguments) {
      }
      if (typeof arguments[i] == 'object') {
        arguments[i] = JSON.stringify(arguments[i])
      }
      arguments[i] += '----' + line.replace("(", "").replace(")", "")
      log.apply(console, arguments)
    };
    
    经过上面的处理,console.log()就会输出打印日志时的代码所在行数。 效果图

    但是我不知道这样处理会不会对nodejs服务器的性能造成不好的影响,所以可以设置一个变量debug代表是否是测试模式,如果不是测试模式的话就不打印。

    简单解释下,stack这个变量大致长成这个样子:"'Error\n at Console.console.log (D:\\codebase\\nodejs\\test\\test.js:132:17)\n at Object.<anonymous> (D:\\codebase\\nodejs\\test\\test.js:140:9)\n at Module._compile (module.js:652:30)\n at Object.Module._extensions..js (module.js:663:10)\n at Module.load (module.js:565:32)\n at tryModuleLoad (module.js:505:12)\n at Function.Module._load (module.js:497:3)\n at Function.Module.runMain (module.js:693:10)\n at startup (bootstrap_node.js:191:16)\n at bootstrap_node.js:612:3' }",然后正则匹配/\(.*?\)/g,第三步是把console.log的最后一个参数字符串化并拼接+=一个字符串line,二line就包含了代码所在的行数信息。

    还有个问题不解:上面的代码粘贴到浏览器的控制台执行,会出现下面的错误, bug to fix

    ,我看到getStackTrace方法使用了递归调用,是这个递归导致的吗?不懂,请大神解释下,不胜感激。


    参考文献
    1. How to get console.log line numbers shown in Nodejs?
    2. How to get result of console.trace() as string in javascript with chrome or firefox?

    相关文章

      网友评论

      • 笨幽灵:不过我的有些函数是回调函数 没有名字 【笑哭】 ,我就用的 let stack = new Error().stack || '';
        stack = stack.split('\n').map(function (line) {
        return line.trim();
        });
        return stack.splice(stack[0] == 'Error' ? 2 : 1);这个
      • 笨幽灵:谢谢~我一直不知道怎么输出,现在终于找了一个能跳转到指定函数的了:pray:

      本文标题:console.log输出打印日志所在代码行数

      本文链接:https://www.haomeiwen.com/subject/eafimftx.html