2012-01-14 2 views
3

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

Я следовал инструкциям на сайте SLF4J к «Т», создавая:

  • StaticLoggerBinder что SLF4J использует во время выполнения для привязки к Loggers и LoggerFactory классов
  • Регистратор адаптер, который будет использоваться чтобы «вперед» org.slf4j.Logger призывает к
  • регистратор завода (используется статический регистратор вяжущего)

Ева rything компилируется отлично. Я собираю его и добавляю в каталог 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: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Going к этому ссылается сайт, кажется, что 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 в его корне по какой-то причине? У меня нет идей. Заранее спасибо!

+1

Ваш StaticLoggerBinder - org.slf4j.impl.StaticLoggerBinder? –

+2

'хотя и не на корневом уровне JAR', что это значит? Чтобы быть найденным, ваш класс должен находиться в '/ org/slf4j/impl/StaticLoggerBinder.class' внутри jar, если он находится в подпапке, он не будет найден. – rsp

ответ

4

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

4

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

0

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

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

Смежные вопросы