Подтвердить что ты не робот

Заставить slf4j использовать обратный вызов

Есть ли способ заставить slf4j использовать конкретного поставщика регистрации (logback в моем случае)? Как и в их документах:

Множественные привязки были найдены на пути к классу

API SLF4J предназначен для привязки к одной и только одной базовой структуре ведения журнала за раз. Если в пути класса присутствует более одного привязки, SLF4J выдаст предупреждение с указанием местоположения этих привязок. Если в пути класса доступны несколько привязок, выберите одно и только одно связывание, которое вы хотите использовать, и удалите другие привязки. Например, если у вас есть как slf4j- > simple-1.6.6.jar, так и slf4j-nop-1.6.6.jar в пути к классу, и вы хотите использовать привязку nop ( > no-operation), затем удалите slf4j- simple-1.6.6.jar из пути класса. Если невозможно удалить суперплоские привязки, SLF4J по-прежнему будет связываться с одной базой данных/реализацией. Начиная с версии 1.6.6, SLF4J назовет класс рамки/реализации, на который он фактически связан.

ПРИМЕЧАНИЕ Предупреждение, выданное SLF4J, - это только предупреждение.

В моем случае у меня есть log4j.jar, slf4j-log4j12.jar, log4j-over-slf4j.jar и все банки журнала в пути к классам. Я знаю, что с ошибкой иметь slf4j-log4j12.jar и log4j-over-slf4j.jar вместе, но мой проект очень большой, и не всегда легко найти и исключить зависимость от maven. В этом случае slf4j даже не печатал никаких предупреждений, потому что мы используем только logback configs. Мне понадобился день, чтобы понять этот адский ад.

Все, что я хочу, это заставить slf4j использовать logback через JVM-аргумент, например, чтобы он мог печатать предупреждения, и я могу исключить банки в будущем.

4b9b3361

Ответ 1

Кроме того, что вы очищаете свой путь класса, невозможно принудительно привязать SLF4J к данной реализации.

Ответ 2

Как правило, ваш собственный код находится в начале пути к классам. Из-за этого один из способов сделать это - создать свой собственный класс org.slf4j.impl.StaticLoggerBinder:

package org.slf4j.impl;

import org.slf4j.ILoggerFactory;
import org.slf4j.spi.LoggerFactoryBinder;

/**
 * Force tests to use JDK14 for logging.
 */
@SuppressWarnings("UnusedDeclaration")
public class StaticLoggerBinder implements LoggerFactoryBinder {
    private static final StaticLoggerBinder SINGLETON = new StaticLoggerBinder();

    public static String REQUESTED_API_VERSION = "1.6";

    public static final StaticLoggerBinder getSingleton() {
      return SINGLETON;
    }

    private StaticLoggerBinder() {
    }

    @Override
    public ILoggerFactory getLoggerFactory() {
        return new JDK14LoggerFactory();
    }

    @Override
    public String getLoggerFactoryClassStr() {
        return "org.slf4j.impl.JDK14LoggerFactory";
    }
}