node.js - Node.js 查看控制台的日志位置
问题描述
例如,如果我console.log
在 Chrome 中执行此操作,它会向我显示它的日志位置grant.js:1
,我是否可以在启动进程时在 Node.js 中获得带有某种标志的类似信息?
解决方案
在对此进行了一些研究之后,在我看来,您确实必须自己实现此功能。正如HarshaHR 所指出的,这个问题之前已经得到了回答。您只需向下滚动一点即可查看不打印完整堆栈跟踪的解决方案。
那里的所有解决方案都依赖于将堆栈跟踪拆分和匹配为字符串,如果将来更改该字符串的格式,它将中断。受GitHub 上的这个要点(以及类似 Stack Overflow 问题的答案)的启发,我想提供自己的解决方案:
'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'});
与我见过的其他解决方案不同,上面的脚本
- 输出没有额外的行和
- 正确处理字符串替换。
你可以prefix
用粉笔或color.js 着色,但我不想在这里介绍依赖项。
上面的脚本使用V8 API 来自定义堆栈跟踪。callee
是一个CallSite
对象,如果您想自定义 ,则具有以下方法prefix
:
getThis
: 返回值this
getTypeName
this
:以字符串形式返回类型。这是存储在 的构造函数字段中的函数的名称this
,如果可用,否则为对象的[[Class]]
内部属性。getFunction
: 返回当前函数getFunctionName
: 返回当前函数的名称,通常是它的name
属性。如果name
属性不可用,则尝试从函数的上下文中推断名称。getMethodName
: 返回包含当前函数的属性this
或其原型之一的名称getFileName
:如果此函数在脚本中定义,则返回脚本的名称getLineNumber
:如果此函数在脚本中定义,则返回当前行号getColumnNumber
:如果此函数在脚本中定义,则返回当前列号getEvalOrigin
:如果此函数是使用调用创建的,则返回一个表示调用eval
位置的字符串eval
isToplevel
: 这是顶级调用吗,也就是说,这是全局对象吗?isEval
: 这个调用是否发生在调用定义的代码中eval
?isNative
: 这个调用是原生 V8 代码吗?isConstructor
: 这是构造函数调用吗?isAsync
:这是一个异步调用(即await
或Promise.all()
)?isPromiseAll
: 这是一个异步调用Promise.all()
吗?getPromiseIndex
Promise.all()
:返回异步堆栈跟踪所遵循的承诺元素的索引,或者null
如果CallSite
不是Promise.all()
调用。
推荐阅读
- function - 如何在 Apache Pulsar 中为 docker 创建函数
- regex - .* 未正确捕获逗号
- python - 无法使用命名引用 URI 签署 xmlsec
- r - 如何将因子级别分配给空类别?
- ios - 多项选择测验:需要为每个问题的多项选择答案设置每个按钮的标题
- javascript - 在 JavaScript 数组中查找最接近的对象匹配
- sql - 是否有一个只能添加工作日的查询,我使用了日期添加功能但它仍然计算周末?
- rust - 如何从 HashMap 或 HashSet 返回 get_mut 的结果?
- scala - Scala 递归继承
- qt - 使用 open ssl 编译 qt 5.12.4 静态失败