Incompatibilidade de estrutura de registro

109

Estou construindo um pequeno aplicativo Java e espero usar o logback para registro.

Meu aplicativo depende de um projeto mais antigo que faz seu registro via

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

... então meu plano era usar

org.slf4j | jcl-over-slf4j | 1.5.6

... para redirecionar o registro JCL para

org.slf4j | slf4j-api | 1.6.0

... e finalmente para

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

para que meu aplicativo possa fazer logon por meio de logback por meio de sua API slf4j, enquanto o código da biblioteca antiga pode fazer logon no mesmo local por meio do redirecionamento.

Infelizmente, isso resulta em

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)

Tentei números de versão mais altos e mais baixos em alguns desses jars e também vasculhei a documentação da API e tal ... mas não consigo encontrar e resolver o problema.

Ajuda por favor?

Embora o logback seja considerado a estrutura de registro "estratégica", tenho alguma margem de manobra no mecanismo de registro que utilizo. Espero usar logback ou log4j, e definitivamente quero mesclar o log do projeto antigo em qualquer que seja a "nova" estrutura de log, por meio de uma configuração comum.

Carl Smotricz
fonte

Respostas:

111

Você está misturando a versão 1.5.6 da ponte jcl com a versão 1.6.0 do slf4j-api; isso não funcionará devido a algumas mudanças no 1.6.0. Use as mesmas versões para ambos, ou seja, 1.6.1 (a mais recente). Eu uso a ponte jcl-over-slf4j o tempo todo e funciona bem.

Holger Hoffstätte
fonte
2
Isso funcionou imediatamente, é claro; Muito obrigado! Eu não tinha usado o 1.6.1 desses potes porque eles não pareciam estar disponíveis. Estou muito irritado com m2eclipse, que pretende mostrar-me todas as versões disponíveis, mas misteriosamente elimina um número significativo delas.
Carl Smotricz de
1
Apenas para o interesse de quem está seguindo: Acabei com uma seta vermelha no gráfico de dependência porque até o mais recente logback-core insiste em slf4j-1.6.0. Demorou um pouco mais com as versões até que todas as setas vermelhas desapareceram, mas agora estão funcionando e todas as setas azuis.
Carl Smotricz de
1
Como exatamente eu faço isso.
user1721803
Obrigado ... Usar o 'jcl-over-slf4j' salvou meu dia.
Tariq M Nasim,
41

As versões SLF4J 1.5.11 e 1.6.0 não são compatíveis (consulte o relatório de compatibilidade ) porque a lista de argumentos do org.slf4j.spi.LocationAwareLogger.logmétodo foi alterada (Object adicionado [] 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 )

Consulte os relatórios de compatibilidade para outras versões SLF4J nesta página .

Você pode gerar tais relatórios pela ferramenta japi-compliance-checker .

insira a descrição da imagem aqui

linuxbuild
fonte
23

Só para ajudar quem está em situação semelhante à minha ...

Isso pode ser causado quando uma biblioteca dependente acidentalmente empacotou uma versão antiga do slf4j. No meu caso, foi tika-0.8. Veja https://issues.apache.org/jira/browse/TIKA-556

A solução alternativa é excluir o componente e, em seguida, depender manualmente da versão correta ou corrigida.

POR EXEMPLO.

    <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>
Peter L
fonte
Obrigado! Fui atingido por isso ao tentar usar o Jackrabbit 2.2.5 com SLF4J 1.6.1 e Logback 0.9.28!
Hendy Irawan,
Obrigado. Vinculei
Hendy Irawan,