Реализация нестандартного провайдера Slf4j не отслеживается

Slf4j предоставляет библиотеки, которые "обманывают" конкретную кодовую базу, думая, что конкретная серверная часть существует, перенаправляя всю регистрацию в один совместимый с API slf4j бэкэнд.

Вкратце, log4j-over-sl4j будет перенаправлять что-либо из определенной регистрации log4j в slf4j.

Так что мой classpath теперь имеет

slf4j-api *-over-slf4j slf4j-simple (to be removed)

Я пытаюсь предоставить пользовательский интерфейс для slf4j 1.8+ (пожалуйста, не спрашивайте почему). Чтобы начать с этим, я скопировал slf4j-simple в свой проект.

Когда slf4j-simple добавляется в качестве зависимости, регистрация происходит, как и ожидалось, но когда я удаляю зависимость и просто сохраняю то же самое содержимое в моей собственной кодовой базе, она не забирает ее (хотя другой пакет)...

Как я могу сделать так, чтобы sl4j видел моего собственного провайдера?

ОБНОВИТЬ

Я вижу, что в банке есть какая-то дополнительная информация, возможно, что использует slf4j для выбора провайдера...

Однако в моем случае мой бэкэнд регистрации находится в моей собственной кодовой базе (я не хочу разделять ее на библиотеку), так есть ли API для установки вашего провайдера на SLF4J?

2 ответа

Решение

SLF4J 1.8+ (который находится в бета-версии на 12.06.2018) отказался от понятия StaticLoggerBinder и вместо этого использует что-то лучше называется ServiceLoader,

Когда у вас есть копия slf4j-simple исходный код в вашей собственной кодовой базе с вашим собственным пакетом, вам нужно всего лишь создать файл в ${projectRoot}/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider и поместите полное имя класса в свой собственный класс, который должен быть подобран your.package.YourLoggingServiceProvider

Убедитесь, что вы удалили любую фактическую привязку к другому провайдеру, slf4j выдаст четкое сообщение об ошибке, что на вашем пути к классам есть несколько привязок.

Сейчас попробуй LoggerFactory.getLogger("something").info("something") он должен забрать ваши классы для регистрации...

Обратитесь к часто задаваемым вопросам по SLF4J, " Как мне сделать мою структуру ведения журналов SLF4J совместимой?" И ее окрестности:

  1. начать с копии существующего модуля,
  2. создайте адаптер между вашей системой регистрации и интерфейсом org.slf4j.Logger
  3. создать фабрику для адаптера, созданного на предыдущем шаге,
  4. измените класс StaticLoggerBinder, чтобы использовать фабрику, созданную на предыдущем шаге

Не похоже, что ваш вопрос упоминает StaticLoggerBinder, который является классом, который должен быть точно таким, чтобы SLF4J работал. Именно так SLF4J находит вашу конкретную реализацию интерфейса ведения журнала.

Другие вопросы по тегам