Несовместимость фреймворка логирования

110

Я создаю небольшое приложение Java и надеюсь использовать логбэк для ведения журнала.

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

org.apache.commons | com.springsource.org.apache.commons.logging | 1.1.1

... так что я планировал использовать

org.slf4j | jcl-over-slf4j | 1.5.6

... перенаправить журнал JCL на

org.slf4j | slf4j-api | 1.6.0

... и в конечном итоге

ch.qos.logback | logback-classic | 0.9.22
ch.qos.logback | logback-core | 0.9.22

поэтому мое приложение может войти в систему через логбэк через свой slf4j API, в то время как старый код библиотеки может войти в то же место через перенаправление.

Увы, это приводит к

java.lang.NoSuchMethodError: org.slf4j.spi.LocationAwareLogger.log(Lorg/slf4j/Marker;Ljava/lang/String;ILjava/lang/String;Ljava/lang/Throwable;)V
at   org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:141)

Я пробовал более высокие и низкие номера версий на некоторых из этих jar-файлов, а также копался в документации API и тому подобном ... но я не могу найти и решить проблему.

Помогите, пожалуйста?

Хотя логбэк считается «стратегической» структурой ведения журнала, у меня есть некоторая свобода действий, в которой я в конечном итоге использую механизм ведения журнала. Тем не менее, я бы надеялся использовать либо logback, либо log4j, и я определенно хочу объединить логирование старого проекта с тем, чем в итоге окажется «новый» фреймворк логирования, с помощью общей конфигурации.

Карл Смотрич
источник

Ответы:

112

Вы смешиваете версию моста jcl 1.5.6 с версией 1.6.0 slf4j-api; это не сработает из-за некоторых изменений в 1.6.0. Используйте для обоих одинаковые версии, т.е. 1.6.1 (самую последнюю). Я все время использую мост jcl-over-slf4j, и он отлично работает.

Хольгер Хоффштетте
источник
2
Конечно, это сработало сразу; Большое спасибо! Я не использовал 1.6.1 из этих банок, потому что они не были доступны. Меня очень раздражает m2eclipse, который якобы показывает мне все доступные версии, но таинственным образом выпадает из значительного их количества.
Carl Smotricz
1
Просто для интереса всех, кто следит за мной: у меня появилась красная стрелка на графике зависимостей, потому что даже последнее ядро ​​логбэка настаивает на slf4j-1.6.0. Потребовалось еще немного повозиться с версиями, пока все красные стрелки не исчезли, но теперь он работает и все синие стрелки.
Carl Smotricz
1
Как именно я это делаю.
user1721803
Спасибо ... Использование 'jcl-over-slf4j' спасло мне день.
Tariq M Nasim
41

SLF4J версии 1.5.11 и 1.6.0 несовместимы (см. Отчет о совместимости ), потому что список аргументов org.slf4j.spi.LocationAwareLogger.logметода был изменен (добавлен Object [] p5):

SLF4J 1.5.11:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Throwable p5 )

SLF4J 1.6.0:

LocationAwareLogger.log ( org.slf4j.Marker p1, String p2, int p3,
                          String p4, Object[] p5, Throwable p6 )

См. Отчеты о совместимости для других версий SLF4J на этой странице .

Вы можете создавать такие отчеты с помощью инструмента проверки соответствия требованиям japi .

введите описание изображения здесь

linuxbuild
источник
23

Просто чтобы помочь тем, кто находится в похожей на меня ситуации ...

Это может быть вызвано тем, что зависимая библиотека случайно включила старую версию slf4j. В моем случае это была тика-0.8. См. Https://issues.apache.org/jira/browse/TIKA-556.

Обходной путь - исключить компонент, а затем вручную зависит от правильной или исправленной версии.

НАПРИМЕР.

<dependency>
    <groupId>org.apache.tika</groupId>
    <artifactId>tika-parsers</artifactId>
    <version>0.8</version>
    <exclusions>
        <exclusion>
            <!-- NOTE: Version 4.2 has bundled slf4j -->
            <groupId>edu.ucar</groupId>
            <artifactId>netcdf</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <!-- Patched version 4.2-min does not bundle slf4j -->
    <groupId>edu.ucar</groupId>
    <artifactId>netcdf</artifactId>
    <version>4.2-min</version>
</dependency>
Питер Л
источник
Спасибо! Я столкнулся с этим при попытке использовать Jackrabbit 2.2.5 с SLF4J 1.6.1 и Logback 0.9.28!
Хенди Ираван
Спасибо. Я связался с вашим ответом здесь: spring-java-ee.blogspot.com/2011/04/…
Хенди Ираван