【问题标题】:Override console.log (or any function in general): Is there a proper way to do this? [duplicate]覆盖console.log(或一般的任何功能):有没有合适的方法来做到这一点? [复制]
【发布时间】:2013-08-05 04:47:51
【问题描述】:

我发现自己在浏览器和 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.logging 代码并将其转换为正确的日志记录代码。

我不确定这是正确的还是完全愚蠢的。

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

也许console.log = logger.debug 也能达到同样的效果。哦,好吧,我想知道如何传递论点。

例如,某些此类事情在浏览器中无论出于何种原因都不起作用(但在节点中起作用):

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

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

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

l.call(console, 'hello');

这意味着它只是少了一点this 的麻烦。

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

【问题讨论】:

    标签: javascript node.js logging log4javascript


    【解决方案1】:

    我不确定这是正确的还是完全愚蠢的。

    对于您自己的项目,应该没问题。不过,对于您打算在 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');
    

    不过,这取决于您使用的特定引擎的版本。对于 Node 0.10.15 和 Chrome 28,console.log 已经绑定到 console。因此,您列出的 sn-p 不会引发错误。

    【讨论】:

      猜你喜欢
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-13
      • 2017-02-17
      相关资源
      最近更新 更多