Мы потратили много времени на разработку собственной собственной системы ведения журнала (правильно или неправильно, то, что было выбрано выше)! И меня попросили написать пользовательскую привязку 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
в его корне по какой-то причине? У меня нет идей. Заранее спасибо!
Ваш StaticLoggerBinder - org.slf4j.impl.StaticLoggerBinder? –
'хотя и не на корневом уровне JAR', что это значит? Чтобы быть найденным, ваш класс должен находиться в '/ org/slf4j/impl/StaticLoggerBinder.class' внутри jar, если он находится в подпапке, он не будет найден. – rsp