我发现自己在浏览器和 node.js 中都经常这样做,现在是时候想出一个正确的方法来做到这一点,而无需每次都调试一段时间。
这是我目前正在做的事情(这是 node.js):
var log4js = require("log4js");
log4js.loadAppender('file');
log4js.addAppender(log4js.appenders.file('log.log'));
var logger = log4js.getLogger();
console.log = function () {
logger.debug.apply(logger, Array.prototype.slice.call(arguments));
};
这基本上是一个猴子补丁,用于获取console.log
ging 代码并将其转换为正确的日志记录代码。
我不确定这是正确的还是完全愚蠢的。
从概念上讲,我将发送到 console.log 的参数强制放入一个数组中,然后将其传递给apply
. 所有这些都是为了解决我不知道如何在 JS 中声明可变参数函数的事实。(也许这是这样做的规范方式)。
或许同样可以使用console.log = logger.debug
. 哦,好吧,我想知道如何传递论点。
例如,某些此类事情在浏览器中无论出于何种原因都不起作用(但在节点中起作用):
var l = console.log;
l('hello');
当然,这与覆盖 console.log 不同,这只是为了缩短它的名称,但仍然如此。
啊,我实际上意识到这里出了什么问题:这会起作用。
l.call(console, 'hello');
这意味着它只是缺少一些this
.
如果您仍在寻找这个问题的实际问题,请查看上面的斜体线。