2013-08-05 94 views
0

我发现自己经常在浏览器和node.js中执行此操作,而现在是时候我想出了一种正确的方法来做到这一点,而无需每次调试一段时间。重写console.log(或者一般的任何函数):有没有适当的方法来做到这一点?

这就是我目前的工作(这是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更改代码,并把它变成正确的日志代码。

我不确定这是否合适或完全asinine。

从概念上讲,我强制将发送到console.log的参数存入数组,然后传递给apply。所有这些都是为了解决这个事实,我不知道如何在JS中声明一个可变参数函数。 (也许这是这样做的标准方法)。

或许console.log = logger.debug可以达到同样的效果。哦,我想知道我怎么能通过论据。

例如,有不会在浏览器无论出于何种原因工作(但确实在节点)这一类的某种东西:

var l = console.log; 
l('hello'); 

enter image description here

当然,这是不与重写console.log相同,这只是为了缩短它的名称,但仍然如此。

啊,我真的意识到这里有什么问题:这会起作用。

l.call(console, 'hello'); 

这意味着它只是缺少一点finagling与this

如果您仍然在寻找这个问题的实际问题,请看上面的斜体。

回答

2

我不确定这是否合适或完全asinine。

对于你自己的项目,应该没问题。尽管如此,我可能会避免修改Node打算在NPM上发布的任何项目的Node记录的API(超出几个建议修改的部分)。


当前,.apply()是指定集合作为函数调用参数的唯一方法。

logger.debug.apply(logger, Array.prototype.slice.call(arguments)); 

虽然,ECMAScript 6将引入spread operator作为替代。

logger.debug(...arguments); 

但是,slice可能不是必需的,因为它在传递之前不会修改集合。

logger.debug.apply(logger, arguments); 

至于l('hello'),您可以使用.bind()确保上下文。

var l = console.log.bind(console); 
l('hello'); 

虽然这取决于您使用的特定引擎的版本。使用节点0.10.15和Chrome 28,console.log已绑定到console。所以,你列出的片段不会引发错误。

相关问题