如何使用变量args

时间:2016-06-02 19:18:10

标签: javascript node.js log4js-node

我正在创建一些NPM模块,这些模块将用于我的大型项目的其他模块中。我的主项目配置并使用log4js NPM来进行日志记录。我还需要在NPM模块中编写一些日志以用于调试/信息目的。

但是,我想使用主模块初始化的记录器。因此,主模块通过创建全局变量(例如< global.logger')或在require()调用期间显式传递来传递记录器实例。

我希望在NPM模块中构建一点智能,以便他们可以编写日志,如果global.logger已初始化,或者如果记录器' var由require()调用初始化。如果在没有定义记录器的情况下使用NPM模块,它仍然可以工作,但只会打印没有日志。

为实现这一目标,我最终采用了这样的几种方法。

方法I:通过检查记录器是否已定义来编写日志。

if (logger) logger.info('Initializing npm module...');
...
if (logger) logger.info('Connecting to db...');
...
if (logger) logger.info('Fetching records...');


方法II - 包装功能

由于方法我看起来很笨拙,每次都检查if,我最后编写了一个包装器fn来执行检查和写入日志,如下所示:

function log(level, msg) {
  if (!global.logger) return;
  level = level.toLowerCase();
  var args = Array.prototype.splice.call(arguments, 2);
  switch(level) {
    case 'info': global.logger.info.apply(global.logger, args);break;
    case 'trace': global.logger.trace.apply(global.logger, msg, args);break;
    case 'debug': global.logger.debug.apply(global.logger, msg, args);break;
    case 'warning': global.logger.warning(global.logger, msg, args);break;
    case 'error': global.logger.error(global.logger, msg, args);break;
    case 'fatal': global.logger.fatal(global.logger, msg, args);break;
    default: throw "Stupid error!";
  }
}

而且,这个包装器会以这种方式调用..

log("info", "Initializing Authorizer module...");

即使认为这种方法有效,但它在包装函数中仍然有很多代码。我相信,可能有更好的方法,但我没有得到它。在这方面的任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

如果我理解您的问题,您正试图避免有条不紊地检查logger。如果您想扩展/覆盖日志记录功能,我会覆盖console.log

  var logHandle = console.log;
  console.log = function(msg) {
    // do something with msg.
    logHandle(msg);
  }

这有两个好处。 1. console.log熟悉node / js开发人员。 2.如果在记录器覆盖它之前调用了console.log,则回退是默认行为。