javascript - 如何使用变量args调用类方法

标签 javascript node.js log4js-node

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

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

我想在 NPM 模块中构建一些智能,以便在初始化了 global.logger 或通过 require() 调用初始化了 'logger' var 的情况下,它们可以写入日志。如果在没有定义记录器的情况下使用 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...");

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

最佳答案

如果我理解您的问题,那么您正在尝试避免有条件地检查记录器。如果您想扩展/覆盖日志记录功能,我会覆盖 console.log

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

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

关于javascript - 如何使用变量args调用类方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37600398/

相关文章:

javascript - WebStorm Node.Js Sequelize 模型类型提示

javascript - Node 的 log4js 不输出到文件,只输出到控制台

javascript - 尝试权限请求通知错误 Javascript

javascript - 如何通过java脚本编程生成html页面的pdf文件

javascript - Jasmine Node 完成未定义

javascript - 在 React Native 中跨两个应用程序共享代码

javascript - 聚合日志并稍后写入文件,而无需直接写入文件

javascript - log4js ConsoleAppender 初始化

javascript - JS 中 console.log ('any string or statement' + object) 和 console.log ('any string or statement' , object) 之间的区别?

javascript - Javascript 中的并行处理模拟