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就包含了代码所在的行数信息。
,我看到getStackTrace方法使用了递归调用,是这个递归导致的吗?不懂,请大神解释下,不胜感激。