记录前缀-使用not-singleton或其他方法

时间:2018-08-09 22:05:25

标签: javascript node.js ecmascript-6 singleton

我正在使用日志帮助程序(在Node.JS中),但是导出的功能很少(error, warn, etc...)。 例如,我还有另外两个脚本正在使用我的“模块”:test1, test2

在两个脚本中初始化日志记录模块(let log = require("./log.js");)时,我都需要这样的错误消息:[time][ERROR][TEST1] actual message...

我可以使用非单一方法,并将构造函数添加到我的日志记录模块中,这将花费TEST1,因此每个脚本都可以拥有自己的记录器。 但是当使用logger的脚本有100个时,也会有100个logger实例。

那么有没有更好的方法来获得相同的结果,每个文件都可以有自己定义的前缀?

2 个答案:

答案 0 :(得分:1)

该模块需要导出工厂功能或构造函数;必须以某种方式传递参数,以创建test1实例。

实例可由用户使用具有自然提供单例功能的模块来处理:

const loggerFactory = require('./log');

module.exports = loggerFactory('test1');

或者通过库本身:

loggerFactory.instances = new WeakMap();

function loggerFactory(name) {
  if (!loggerFactory.instances.has(name)) {
    loggerFactory.instances.set(name, ...);
  }

  return loggerFactory.instances.get(name);
}

第二种情况正是renowned debug library所做的,尽管出于兼容性原因,它处理的是带有常规对象而不是WeakMap的实例映射。

答案 1 :(得分:0)

希望这对您的某些情况有所帮助...

const log = console.log;
export default function middleWare(optionalStringExtension = '') {
    console.log = (...args) => {
        log(...args, optionalStringExtension);
    }
}