【问题标题】:Logging prefixes - Use not-singleton or another method记录前缀 - 使用非单例或其他方法
【发布时间】:2018-08-09 22:05:24
【问题描述】:

我正在开发日志助手(在 Node.JS 中),女巫几乎没有导出函数 (error, warn, etc...)。 例如,我有两个其他脚本使用我的“模块”:test1, test2

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

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

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

【问题讨论】:

  • 你可以在你的记录器中创建一个初始化函数。然后点赞let log=require('./log.js'); log.init('test1')。这可能会让你在加载它时更清楚地知道正在发生的事情。
  • 我有这种方法,但是当我对文件 test1.js 和 log.init('test2') 在文件 test2.js 和 test1.js 中执行 log.init('test1') 时,test1.js 将调用 log.error(blah),您将获得 test2 的前缀,因为它的单身
  • 哦,好吧,对不起。您可以尝试stackoverflow.com/questions/16697791/… 和相关问题中的类似方法来获取调用日志记录功能的文件的名称
  • 是的,当你总是想要前缀=文件名时,文件名是个好主意,但我需要自定义前缀
  • 或者根本没有前缀

标签: javascript node.js ecmascript-6 singleton


【解决方案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 处理实例映射。

【讨论】:

  • 但是这种方法仍然会为每个脚本创建一个记录器实例,对吧?可以将它用于许多脚本吗?
  • 它不处理“脚本”。它为每个命名空间创建一个实例(name 参数)。即loggerFactory('test') === loggerFactory('test')。无论是否为每个脚本,您都可以根据需要创建任意数量的实例。我仍然不确定这是否是您想要的,这个问题很模棱两可。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多