Node.js查看控制台的日志位置
例如,如果我在Chrome中执行Node.js查看控制台的日志位置,node.js,Node.js,例如,如果我在Chrome中执行console.log,它将向我显示它的位置,类似于grant.js:1,我可以在Node.js中获得类似的信息,并在启动流程时使用某种类型的标志吗 在对此做了一些研究之后,我觉得您真的必须自己实现此功能。正如所指出的,这是一个问题。您只需向下滚动一点,就可以看到不打印完整堆栈跟踪的解决方案 那里的所有解决方案都依赖于将堆栈跟踪作为字符串进行拆分和匹配,如果该字符串的格式在将来发生更改,这将中断。受此启发(以及类似堆栈溢出问题的答案),我想提供自己的解决方案: '
console.log
,它将向我显示它的位置,类似于grant.js:1
,我可以在Node.js中获得类似的信息,并在启动流程时使用某种类型的标志吗 在对此做了一些研究之后,我觉得您真的必须自己实现此功能。正如所指出的,这是一个问题。您只需向下滚动一点,就可以看到不打印完整堆栈跟踪的解决方案
那里的所有解决方案都依赖于将堆栈跟踪作为字符串进行拆分和匹配,如果该字符串的格式在将来发生更改,这将中断。受此启发(以及类似堆栈溢出问题的答案),我想提供自己的解决方案:
'use strict';
const path = require('path');
['debug', 'log', 'warn', 'error'].forEach((methodName) => {
const originalLoggingMethod = console[methodName];
console[methodName] = (firstArgument, ...otherArguments) => {
const originalPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = (_, stack) => stack;
const callee = new Error().stack[1];
Error.prepareStackTrace = originalPrepareStackTrace;
const relativeFileName = path.relative(process.cwd(), callee.getFileName());
const prefix = `${relativeFileName}:${callee.getLineNumber()}:`;
if (typeof firstArgument === 'string') {
originalLoggingMethod(prefix + ' ' + firstArgument, ...otherArguments);
} else {
originalLoggingMethod(prefix, firstArgument, ...otherArguments);
}
};
});
// Tests:
console.log('%s %d', 'hi', 42);
console.log({ a: 'foo', b: 'bar'});
与我见过的其他解决方案不同,上面的脚本
- 输出没有额外的行和
- 处理正确
前缀上色,但我不想在这里引入依赖项
上面的脚本使用。被调用方
是一个调用站点
对象,如果您想自定义前缀
,可以使用以下方法:
getThis
:返回此的值
getTypeName
:以字符串形式返回此
的类型。这是存储在This
的构造函数字段中的函数名(如果可用),否则为对象的[[Class]]]
内部属性
getFunction
:返回当前函数getFunctionName
:返回当前函数的名称,通常是其name
属性。如果名称
属性不可用,则尝试从函数的上下文推断名称getMethodName
:返回此
或其包含当前函数的原型之一的属性的名称getFileName
:如果此函数是在脚本中定义的,则返回脚本的名称getLineNumber
:如果此函数是在脚本中定义的,则返回当前行号getColumnNumber
:如果此函数是在脚本中定义的,则返回当前列号getEvalOrigin
:如果此函数是通过调用eval
创建的,则返回表示调用eval
的位置的字符串isToplevel
:这是一个顶级调用,也就是说,这是全局对象吗isEval
:此调用是否发生在调用eval
定义的代码中isNative
:此调用是否在本机V8代码中isConstructor
:这是构造函数调用吗isAsync
:这是一个异步调用(即wait
还是Promise.all()
)isPromiseAll
:这是对Promise.all()
的异步调用吗getPromiseIndex
:返回异步堆栈跟踪的promise.all()
中紧跟的promise元素的索引,如果CallSite
不是promise.all()
调用,则返回null
在对此做了一些研究之后,在我看来,您真的必须自己实现这个特性。正如所指出的,这是一个问题。您只需向下滚动一点,就可以看到不打印完整堆栈跟踪的解决方案 那里的所有解决方案都依赖于将堆栈跟踪作为字符串进行拆分和匹配,如果该字符串的格式在将来发生更改,这将中断。受此启发(以及类似堆栈溢出问题的答案),我想提供自己的解决方案:
'use strict';
const path = require('path');
['debug', 'log', 'warn', 'error'].forEach((methodName) => {
const originalLoggingMethod = console[methodName];
console[methodName] = (firstArgument, ...otherArguments) => {
const originalPrepareStackTrace = Error.prepareStackTrace;
Error.prepareStackTrace = (_, stack) => stack;
const callee = new Error().stack[1];
Error.prepareStackTrace = originalPrepareStackTrace;
const relativeFileName = path.relative(process.cwd(), callee.getFileName());
const prefix = `${relativeFileName}:${callee.getLineNumber()}:`;
if (typeof firstArgument === 'string') {
originalLoggingMethod(prefix + ' ' + firstArgument, ...otherArguments);
} else {
originalLoggingMethod(prefix, firstArgument, ...otherArguments);
}
};
});
// Tests:
console.log('%s %d', 'hi', 42);
console.log({ a: 'foo', b: 'bar'});
与我见过的其他解决方案不同,上面的脚本
- 输出没有额外的行和
- 处理正确
前缀上色,但我不想在这里引入依赖项
上面的脚本使用。被调用方
是一个调用站点
对象,如果您想自定义前缀
,可以使用以下方法:
getThis
:返回此的值
getTypeName
:以字符串形式返回此
的类型。这是存储在This
的构造函数字段中的函数名(如果可用),否则为对象的[[Class]]]
内部属性
getFunction
:返回当前函数getFunctionName
:返回当前函数的名称,通常是其name
属性。如果名称
属性不可用,则尝试从函数的上下文推断名称getMethodName
:返回此
或其包含当前函数的原型之一的属性的名称getFileName
:如果此函数是在脚本中定义的,则返回脚本的名称getLineNumber
:如果此函数是在脚本中定义的,则返回当前行号getColumnNumber
:如果此函数是在脚本中定义的,则返回当前列号getEvalOrigin
:如果此函数是通过调用eval
创建的,则返回表示调用eval
的位置的字符串isToplevel
:这是一个顶级调用,也就是说,这是全局对象吗isEval
:此调用是否发生在调用eval
定义的代码中isNative
:此调用是否在本机V8代码中isConstructor
:这是构造函数调用吗isAsync
:这是一个异步调用(即wait
还是Promise.all()