在Node.js下自定义/装饰console.log

Customize/Decorate console.log under Node.js

本文关键字:装饰 console log 自定义 Node js      更新时间:2023-09-26

我想在Node.js下装饰console.log的输出,就像下面的代码一样

var console = {
    log: function(text) {
         global.console.log('Test: ' + text);
    }
};
console.log('custom console is here');

输出:

Test: custom console is here

但是,如果我删除变量console之前的var

console = {
    log: function(text) {
         global.console.log('Test: ' + text);
    }
};
console.log('custom console is here');

输出将是

custom console is here

我知道当var被删除时,console将成为全局变量。根据我的理解,它将覆盖global.console,但似乎不是为什么global.console不能被覆盖

第二个问题:有没有更好的方法来自定义console.log

为什么global.console不能被覆盖?

因为它是一个只有getter(用于加载console模块)的访问器属性
尝试严格模式,你的作业就会失败。

它可以通过使用Object.defineProperty覆盖,但这是一个非常糟糕的主意,因为许多模块都依赖于它

有没有更好的方法来定制console.log

不,最好使用模块本地的console变量。

当然,您可以改进您的实现,例如,正确处理多个参数,成为一个实际的Console实例(使用所有方法),或者通过require("my-console.js")可用,以便您可以在多个模块中使用它。

正如其他人所提到的,覆盖console.log函数不是一个好主意,因为许多模块都依赖于它

除此之外,在您的代码中,您将控制台变量设置为一个全新的对象,该对象只有函数log,该函数只能处理一个参数,而console.log可以处理多个参数。

如果你真的想覆盖这个功能,可以试试这样的方法:

function decorateLog(string) {
    var originalFunc = console.log;
    console.log = function(){
      originalFunc.apply(console, [string].concat([].slice.call(arguments)))
    }
}
decorateLog('Test:')
console.log('custom console is here'); //=> Test: custom console is here
console.log('foo', 'bar'); //=> Test: foo bar

但是,如果您只是需要更好的调试日志,请尝试调试包。