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


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 .

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


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/…
— Хенди Ираван
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.