Префиксы ведения журнала - используйте не-синглтон или другой метод

1

Я работаю над помощником по протоколированию (в Node.JS), у которого мало экспортируемых функций (error, warn, etc...). У меня есть, например, два других сценария, которые используют этот мой "модуль": test1, test2

Мне нужно, когда я инициализирую свой модуль регистрации (let log = require("./log.js");) в обоих сценариях, чтобы получить сообщения об ошибках следующим образом: [time][ERROR][TEST1] actual message...

Я могу использовать метод non-singleton и добавить конструктор в мой модуль регистрации, что будет принимать TEST1 чтобы каждый скрипт мог иметь свой собственный регистратор. Но когда будет 100 скриптов с использованием регистратора, также будет 100 экземпляров регистратора.

Итак, есть ли лучший подход для получения того же результата, каждый файл CAN имеет свой собственный определенный префикс?

  • 1
    Вы можете сделать функцию инициализации в вашем логгере. Затем выполните let log=require('./log.js'); log.init('test1') . Это может сделать более явным, что что-то происходит, когда вы загружаете это.
  • 1
    У меня был такой подход, но когда я делаю log.init('test1') в файле test1.js и log.init('test2') в файле test2.js и test1.js вызовет log.error(blah) , вы будете получить префикс test2, потому что его синглтон
Показать ещё 4 комментария
Теги:
ecmascript-6
singleton

1 ответ

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);
}

Второй случай - это именно то, что делает известная библиотека debug, хотя для соображений совместимости она обрабатывает карту экземпляров с обычным объектом вместо WeakMap.

  • 1
    Но эти методы все равно будут создавать один экземпляр логгера для каждого скрипта, верно? Можно ли использовать это для многих сценариев?
  • 1
    Это не касается «сценариев». Он создает один экземпляр для каждого пространства имен ( name параметра). т.е. loggerFactory('test') === loggerFactory('test') . Вы можете создать столько или несколько экземпляров, сколько вам нужно, для каждого сценария или нет. Я до сих пор не уверен, если это то, что вы хотели, вопрос довольно двусмысленный.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню