我正在创建一些 NPM 模块,它们将在我的大型项目的其他模块中使用。我的主项目配置并使用 log4js NPM 进行日志记录。我还需要在 NPM 模块中编写一些日志以用于调试/信息目的。
但是,我想使用由主模块初始化的记录器。因此,主模块通过创建全局变量(例如“global.logger”)或在 require() 调用期间显式传递来传递记录器实例。
我想在 NPM 模块中构建一点智能,以便它们可以写入日志,如果 global.logger 已初始化,或者“logger”变量是否由 require() 调用初始化。如果在没有定义记录器的情况下使用 NPM 模块,它仍然可以工作,但不会打印任何日志。
为了实现这一点,我最终采用了几种这样的方法。
方法一: 通过检查是否定义了记录器来编写日志。
if (logger) logger.info('Initializing npm module...');
...
if (logger) logger.info('Connecting to db...');
...
if (logger) logger.info('Fetching records...');
方法二——包装函数
由于方法看起来很笨拙,每次都进行 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...");
即使认为这种方法有效,但在包装函数中仍然有很多代码。我敢肯定,可能有更好的方法,但我不明白。非常感谢这方面的任何帮助。