Javascript 日志前缀-不要使用singleton或其他方法
我正在使用logging helper(在Node.JS中),它几乎没有导出的函数(错误、警告等)。 例如,我还有另外两个脚本使用我的“模块”:Javascript 日志前缀-不要使用singleton或其他方法,javascript,node.js,ecmascript-6,singleton,Javascript,Node.js,Ecmascript 6,Singleton,我正在使用logging helper(在Node.JS中),它几乎没有导出的函数(错误、警告等)。 例如,我还有另外两个脚本使用我的“模块”:test1,test2 我需要在两个脚本中初始化日志模块(let log=require(“./log.js”);)时获得如下错误消息:[time][error][TEST1]实际消息… 我可以使用非单例方法,将构造函数添加到我的日志模块中,这样每个脚本都可以有自己的记录器。 但是当有100个脚本使用logger时,也会有100个logger实例 那么,
test1,test2
我需要在两个脚本中初始化日志模块(let log=require(“./log.js”);
)时获得如下错误消息:[time][error][TEST1]实际消息…
我可以使用非单例方法,将构造函数添加到我的日志模块中,这样每个脚本都可以有自己的记录器。
但是当有100个脚本使用logger时,也会有100个logger实例
那么,是否有更好的方法来获得相同的结果,每个文件都可以有自己定义的前缀?模块需要导出工厂函数或构造函数;为了创建
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);
}
第二种情况正是如此,尽管出于兼容性原因,它使用常规对象而不是
WeakMap
处理实例映射。您可以在记录器中创建init函数。然后像letlog=require('./log.js');log.init('test1')
。这可能会使加载时发生的事情更加明确。我有这种方法,但当我在test1.js文件中执行log.init('test1')
时,以及在test2.js文件中执行log.init('test2')
时,test1.js将调用log.error(blah)
,您将得到test2的前缀,因为它是单音的,很抱歉。您可以尝试类似in和相关问题的方法来获取调用日志功能的文件名Yea filename是一个好主意,当您总是希望使用prefix=filename时,但我需要自定义prefixOr,也完全没有前缀,但此方法仍然会为每个脚本创建一个logger实例,对吗?对许多脚本使用这个可以吗?它不处理“脚本”。它为每个命名空间创建一个实例(name
param)。i、 e.loggerFactory('test')==loggerFactory('test')
。无论是否为每个脚本,都可以根据需要创建任意多个或少数实例。我仍然不确定这是否是你想要的,这个问题相当模糊。