簡體   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