2012-03-16 4 views
11

우리는 로깅 외관으로 slf4j를 사용하여 새로운 시스템을 구축하고 있습니다. 새로 웹 로직 12C를에 배포 할 때, 우리는 콘솔 로그에서이 오류를 발견 : Weblogic 12c가 시스템의 slf4j 바인딩을 사용하지 못하도록하십시오.

SLF4J: Class path contains multiple SLF4J bindings. 
SLF4J: Found binding in [jar:file:/opt/Oracle/Middleware2/modules/org.slf4j.jdk14_1.6.1.0.jar!/org/slf4j/impl/StaticLoggerBinder.class] 
SLF4J: Found binding in [zip:/opt/Oracle/Middleware2/user_projects/domains/m3/servers/AdminServer/tmp/_WL_user/test/t030q4/war/WEB-INF/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class] 

는 인터넷 검색 후, 우리는이 단지 경고 것을 발견

, SLF4J 먼저이 경우 웹 로직의 시스템 로그 프레임 워크 로거를 발견 바인딩 . WAR 파일의 로깅 프레임 워크에 바인딩 할 수있는 방법이 있습니까? < weblogic.xml에 >을 사용하면 도움이되지 않습니다.

답변

0

클래스 경로에서 자체 발견을 기반으로하므로 SLF4J가 자체 버전을 강제하는 방법을 제공한다고 생각하지 않습니다.

WebLogic에 대한 관리 권한이있는 경우 가장 간단한 해결 방법은 WebLogic 설치 폴더에서 파일을 업데이트하여 WebLogic SLF4J 버전을 1.6.4로 업그레이드하는 것입니다. 나는 가 WAR에서 작동하지 않습니다-WEB-INF-클래스를 선호하는 경우가 작동합니다 의심하지만

그렇지 않으면, 권고 here을 대신 WAR의 귀를 구축하고 따라갈 수 있습니다.

+0

어, 내 말은 "시스템 라이브러리에 바인딩하는 대신 저에게 제공되는 로그 라이브러리에 slf4j 바인더 로거를 만듭니다"입니다. 이것은 slf4j의 버전과 관련이 없습니다.이 오류가 발생하고 slf4j의 문서에 따르면 slf4j가 여러 바인더 블 로거를 발견하면 항상 시스템의 slf44 바인딩 인 첫 번째 로거에 바인딩됩니다. – dhchen

2

Log4J를 사용하여 로깅을 구성해야하므로이 문제가 발생했습니다. 그러나 prefer-application-packages 사용하는 예는 다음과 EAR의 META-INF 폴더에 weblogic-application.xml 파일을 넣어, 지금까지 작동하는 것 같다 :

<?xml version="1.0" encoding="UTF-8"?> 
<weblogic-application xmlns="http://www.bea.com/ns/weblogic/90" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/90 http://www.bea.com/ns/weblogic/90/weblogic-application.xsd http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/application_1_4.xsd" > 
    <prefer-application-packages> 
     <package-name>org.slf4j</package-name> 
    </prefer-application-packages> 
</weblogic-application> 

(확인 지정된 XMLNS 것은 오래된 일이지만 작동, 당신은 그것을 업데이트 할 수 있습니다 원한다면, 나는 우리의 것을 가져다가 관련이없는 부분을 제거했다.)

위의 경고가 있지만 아직 필요에 따라 Log4J가 사용됩니다. 실제로 로그에서 the URL specified on the next line을 보면 (질문에서 생략), 다음과 같이 표시됩니다.

SLF4J에서 발생하는 경고는 경고입니다. SLF4J는 여전히 클래스 경로에서 찾은 첫 번째 프레임 워크 인 으로 바인딩합니다.

그래서 나는 (즉 클래스 패스에 처음 만드는) 아직도 우리가 실제로 우리의 EAR에서 하나를 선호하도록 구성 로딩 org.slf4j.impl.StaticLoggerBinder에 대한 일반 클래스 로딩 메커니즘을 사용 같아요.

그러나 경고는 그대로 유지되지만 작동합니다. WebLogic을 제공하는 라이브러리를 변경하지 않고도 경고를 수정하는 것은 좋지만 가능하지는 않습니다.

4

WAR 파일의 경우 thisthis 개의 게시물에 설명 된 weblogic.xmlprefer-application-packages을 사용해야합니다. SLF4J는 자원으로서가 아닌 클래스와 StaticLoggerBinder.class 찾기 때문

귀하의 경우는,

<?xml version="1.0" encoding="UTF-8"?> 
<wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> 
    <wls:container-descriptor> 
     <wls:prefer-application-packages> 
      <wls:package-name>org.slf4j</wls:package-name> 
     </wls:prefer-application-packages> 
    </wls:container-descriptor> 
</wls:weblogic-web-app> 
27

필터링 클래스에 있지만 자원을해서는 안 같은 것입니다.

이것을 weblogic-application에 포함하십시오.xml :

<wls:prefer-application-packages> 
    <wls:package-name>org.slf4j.*</wls:package-name> 
    <wls:package-name>org.apache.commons.*</wls:package-name> 
</wls:prefer-application-packages> 

<wls:prefer-application-resources> 
    <wls:resource-name>org/slf4j/impl/StaticLoggerBinder.class</wls:resource-name> 
</wls:prefer-application-resources> 

로거가 시스템 클래스 로더 대신 사용됩니다.

+3

org.apache가 있습니다. commons. * SLF4J 작업에 필요한 항목? 그렇다면 왜? –

+0

며칠 늦었지만 com.apache.commons.logging. * – HRgiger

관련 문제