Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js查看控制台的日志位置_Node.js - Fatal编程技术网

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

Node.js查看控制台的日志位置,node.js,Node.js,例如,如果我在Chrome中执行console.log,它将向我显示它的位置,类似于grant.js:1,我可以在Node.js中获得类似的信息,并在启动流程时使用某种类型的标志吗 在对此做了一些研究之后,我觉得您真的必须自己实现此功能。正如所指出的,这是一个问题。您只需向下滚动一点,就可以看到不打印完整堆栈跟踪的解决方案 那里的所有解决方案都依赖于将堆栈跟踪作为字符串进行拆分和匹配,如果该字符串的格式在将来发生更改,这将中断。受此启发(以及类似堆栈溢出问题的答案),我想提供自己的解决方案: '

例如,如果我在Chrome中执行
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()