Niezgodność RAM logowania

Buduję małą aplikację Java i mam nadzieję użyć logback do logowania.

Moja aplikacja jest zależna od starszego projektu, który loguje się przez

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

...więc moim planem było użycie

org.slf4j | jcl-over-slf4j | 1.5.6

... przekierowanie logowania JCL do

org.slf4j | slf4j-api | 1.6.0

...i ostatecznie do

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

Więc moja aplikacja może logować się przez logback poprzez API slf4j, podczas gdy stary kod biblioteki może zalogować się do tej samej lokalizacji poprzez przekierowanie.

Niestety, skutkuje to

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)

Próbowałem wyższych i niższych liczb weryfikacji na niektórych z tych słoików, a także grzebałem w dokumentacji API i tym podobnych... ale nie jestem w stanie znaleźć i rozwiązać problemu.

Pomocy, proszę?

Chociaż logback jest uważany za" strategiczny " framework logowania, mam pewną swobodę, w jakiej mechanizmie logowania ostatecznie używam. Mam jednak nadzieję, że użyję logbacka lub log4j i zdecydowanie chcę połączyć logowanie starego projektu z dowolnym" nowym " logowaniem framework kończy się, poprzez wspólną konfigurację.

Author: linuxbuild, 2010-08-19

3 answers

Mieszasz wersję 1.5.6 JCL bridge z wersją 1.6.0 slf4j-api; to nie zadziała z powodu kilku zmian w 1.6.0. Używaj tych samych wersji dla obu, np. 1.6.1 (najnowsza). Cały czas używam mostu jcl-over-slf4j i działa dobrze.

 110
Author: Holger Hoffstätte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-20 07:06:58

Wersje SLF4J 1.5.11 i 1.6.0 nie są kompatybilne (patrz compatibility report) ponieważ lista argumentów metody org.slf4j.spi.LocationAwareLogger.log została zmieniona (dodano obiekt[] 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 )

Zobacz raporty zgodności dla innych wersji SLF4J na tej stronie .

Możesz generować takie raporty za pomocą narzędzia japi-compliance-checker.

Tutaj wpisz opis obrazka

 41
Author: linuxbuild,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-05 21:36:00

Żeby pomóc tym, którzy są w podobnej sytuacji do mnie...

Może to być spowodowane, gdy zależna biblioteka przypadkowo połączyła starą wersję slf4j. w moim przypadku była to tika-0.8. Zobacz https://issues.apache.org/jira/browse/TIKA-556

Obejście polega na wykluczeniu komponentu, a następnie ręcznym zależeniu od poprawnej lub poprawionej wersji.

Np.

    <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>
 23
Author: Peter L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-12-01 04:43:33