프레임 워크 비 호환성 로깅


109

저는 작은 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)

이 항아리 중 일부에 대해 더 높고 낮은 버전 번호를 시도하고 API 문서 등을 파헤 쳤지 만 문제를 찾아 해결할 수 없습니다.

도와주세요?

로그 백은 "전략적"로깅 프레임 워크로 간주되지만 궁극적으로 사용하는 로깅 메커니즘에 약간의 여유가 있습니다. 그래도 logback이나 log4j를 사용하고 싶고, 공통 구성을 통해 이전 프로젝트의 로깅을 "새로운"로깅 프레임 워크가 무엇이든간에 병합하고 싶습니다.

답변:


111

1.5.6 버전의 jcl 브리지를 1.6.0 버전의 slf4j-api와 혼합하고 있습니다. 1.6.0의 몇 가지 변경 사항 때문에 작동하지 않습니다. 둘 다에 대해 동일한 버전, 즉 1.6.1 (최신)을 사용하십시오. 나는 항상 jcl-over-slf4j 브리지를 사용하고 잘 작동합니다.


2
물론 그것은 즉시 작동했습니다. 대단히 감사합니다! 나는 그들이 사용할 수있는 것처럼 보이지 않았기 때문에 1.6.1의 항아리를 사용하지 않았습니다. m2eclipse는 사용 가능한 모든 버전을 보여 주지만 신비하게 상당수의 버전을 삭제한다고 주장하는 m2eclipse에 매우 짜증이납니다.
Carl Smotricz 2010 년

1
다른 사람의 관심을 끌기 위해 : 최신 logback-core조차도 slf4j-1.6.0을 주장하기 때문에 종속성 그래프에 빨간색 화살표가 표시되었습니다. 모든 빨간색 화살표가 사라질 때까지 버전을 좀 더 다루어야했지만 이제는 모두 작동하고 모든 파란색 화살표가 있습니다.
Carl Smotricz 2010 년

1
정확히 어떻게해야하나요?
user1721803

감사합니다 ... 'jcl-over-slf4j'를 사용하여 하루를 절약했습니다.
Tariq M Nasim 2016 년

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-compliance-checker 도구로 이러한 보고서를 생성 할 수 있습니다 .

여기에 이미지 설명 입력


23

저와 비슷한 상황에있는 사람들을 돕기 위해서 ...

이는 종속 라이브러리가 실수로 slf4j의 이전 버전을 번들로 묶었을 때 발생할 수 있습니다. 제 경우에는 tika-0.8이었습니다. 참조 https://issues.apache.org/jira/browse/TIKA-556를

해결 방법은 구성 요소를 제외하고 올바른 버전이나 패치 된 버전에 수동으로 의존하는 것입니다.

EG.

    <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>

감사! SLF4J 1.6.1 및 Logback 0.9.28과 함께 Jackrabbit 2.2.5를 사용하려고 할 때 이것에 맞았습니다!
Hendy Irawan 2011

감사. 나는 당신의 대답을 여기에 연결했습니다 : spring-java-ee.blogspot.com/2011/04/…
Hendy Irawan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.