Пользовательская привязка SLF4J не работает - PullRequest
3 голосов
/ 14 января 2012

Мы потратили много времени на разработку нашей собственной системы ведения журналов (правильной или неправильной, именно так решили высокопоставленные лица!), И меня попросили написать собственную привязку SLF4J (реализация API), чтобы многие из наших Компоненты, использующие SLF4J (например, Apache Camel), начнут регистрироваться в нашей новой собственной системе.

Я следовал инструкциям на сайте SLF4J до буквы "T", создавая:

  • A StaticLoggerBinder, который SLF4J использует во время выполнения для привязки к Loggers и LoggerFactory классам
  • Адаптер логгера, который будет использоваться для "переадресации" org.slf4j.Logger вызовов на
  • Фабрика логгеров (используется связывателем статических логгеров)

Все отлично компилируется. Я собираю его и добавляю в каталог lib тестового проекта вместе с slf4j-api-1.6.2.jar (версия, которую они хотят, чтобы я использовал). Я добавил оба JAR-файла в путь сборки в Eclipse.

Я создаю новую конфигурацию запуска для тестового проекта, и в области вкладок Classpath конфигурации запуска я вижу, что она имеет User Entries >> TestBinding >> Slf4jBinding.jar and slf4j-api-1.6.2.jar.

Итак, похоже, что оба JAR-файла находятся внутри пути к классу Run Configuration.

После запуска драйвера внутри проекта, который выглядит следующим образом:

public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(TestDriver.class);
    logger.error("Test");
}

Я получаю следующие ошибки времени выполнения:

SLF4J: Не удалось загрузить класс "org.slf4j.impl.StaticLoggerBinder". SLF4J: по умолчанию реализация логгера без операций (NOP) SLF4J: Подробнее см. http://www.slf4j.org/codes.html#StaticLoggerBinder.

Переходя на этот ссылочный сайт, кажется, что SLF4J не может найти мой StaticLoggerBinder на пути к классам, который находится внутри Slf4jBinding.jar, хотя и не на корневом уровне JAR.

Я посмотрел на исходный файл SLF4J LoggerFactory.java и нашел код, который выдает такую ​​ошибку:

private final static void bind() {
    try {
        // the next line does the binding
        StaticLoggerBinder.getSingleton();
        INITIALIZATION_STATE = SUCCESSFUL_INITILIZATION;
        emitSubstituteLoggerWarning();
    } catch (NoClassDefFoundError ncde) {
        String msg = ncde.getMessage();
        if (messageContainsOrgSlf4jImplStaticLoggerBinder(msg)) {
            INITIALIZATION_STATE = NOP_FALLBACK_INITILIZATION;
            Util
            .report("Failed to load class \"org.slf4j.impl.StaticLoggerBinder\".");
            Util.report("Defaulting to no-operation (NOP) logger implementation");
            Util.report("See " + NO_STATICLOGGERBINDER_URL
            + " for further details.");
        } // ...

Очевидно, что вызов в верхней части блока try (StaticLoggerBinder.getSingleton()) выбрасывает NoClassDefFoundError. Я просто не понимаю, почему.

Я решил не вставлять свой код здесь, потому что я думаю, что это просто проблема с classpath. Правильно ли мой код придерживается политики связывания SLF4J, пока неизвестно, пока я не смогу обойти эту проблему.

Есть ли дополнительный шаг, который мне нужно предпринять в Eclipse для настройки пути к классам? Может ли мой Slf4jBinding.jar нуждаться в StaticLoggerBinder внутри его корня по какой-то причине? У меня нет идей здесь. Заранее спасибо!

Ответы [ 3 ]

5 голосов
/ 14 января 2012

Вашему jar-файлу нужна пользовательская реализация org.slf4j.impl.StaticLoggerBinder, и полное имя класса этой реализации должно быть точно org.slf4j.impl.StaticLoggerBinder.Статическая привязка работает, если SLF4J API скомпилирован с версией-заглушкой org.slf4j.impl.StaticLoggerBinder, и тогда во время выполнения загрузчик классов загрузит реальную версию из привязки SLF4J.Каждая привязка SLF4J имеет свою версию класса org.slf4j.impl.StaticLoggerBinder, подходящую для этой конкретной привязки.

4 голосов
/ 14 января 2012

Вместо того, чтобы начинать с нуля, просто адаптируйтесь, например. slf4j-simple.jar для ваших нужд. Весь код привязки есть, вам просто нужно адаптировать код, ведя фактическую регистрацию.

0 голосов
/ 28 февраля 2012

Вы можете создать пакет org.slf4j.impl в своем проекте и реализовать класс с именем StaticLoggerBinder в этом пакете, как описано в http://javaeenotes.blogspot.com/2011/12/custom-slf4j-logger-adapter.html (я только что сделал это, и он прекрасно работает для меня).

Обратите внимание, что вам не нужно создавать файл JAR для этого, вам просто нужно иметь класс org.slf4j.impl.StaticLoggerBinder, доступный в вашем classpath (он может быть в jar, но это не обязательно).

...