Customize/Decorate console.log 在 Node.js 下

Customize/Decorate console.log under Node.js

我想像下面的代码一样修饰 Node.jsconsole.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

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

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

Why the global.console cannot be override?

因为它是 属性 和 only a getter (which loads the console module) 的访问器。
试试严格模式,你的作业就会抛出。

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

Is there any better way to custom console.log?

不,模块本地的 console 变量似乎是最好的主意。

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

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

除此之外,在您的代码中,您将控制台变量设置为一个只有函数 log 的全新对象,该函数只能处理 1 个参数,而 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

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