繁体   English   中英

Node.js 查看控制台日志的位置

[英]Node.js see where the console was log

例如,如果我在 Chrome 中执行console.log ,它会向我显示它的日志位置,如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'});

与我见过的其他解决方案不同,上面的脚本

您可以使用chalkcolor.jsprefix着色,但我不想在这里引入依赖项。

上面的脚本使用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 :这是一个异步调用(即awaitPromise.all() )?
  • isPromiseAll :这是对Promise.all()的异步调用吗?
  • getPromiseIndex :返回Promise.all()用于异步堆栈跟踪的 promise 元素的索引,如果CallSite不是Promise.all()调用,则返回null

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM