log4j 멀티classloader 중복 불러오기 설정 문제 해결

1555 단어 GWT/GXT
log4j:ERROR A "org.apache.log4j.xml.DOMConfigurator"object is not assignable to a "org.apache.log4j.spi.Configurator"variable. log4j:ERROR The class "org.apache.log4j.spi.Configurator"was loaded by log4j:ERROR [java.net.URLClassLoader@5b0a69d3] whereas object of type log4j:ERROR "org.apache.log4j.xml.DOMConfigurator"was loaded by [WebappClassLoader   context:   delegate: false   repositories:    /WEB-INF/classes/----------> Parent Classloader: org.apache.catalina.loader.StandardClassLoader@4d405ef7 ]. log4j:ERROR Could not instantiate configurator [org.apache.log4j.xml.DOMConfigurator]. log4j:WARN No appenders could be found for logger (com.xxx.xxx.xxx). log4j:WARN Please initialize the log4j system properly.
오류 정보가 뚜렷합니다.log4j는 두 개의 다른classloader에 의해 두 번 초기화되어 결과가 틀렸습니다.이 문제는 해결하기 어렵지 않다. 주로 두 가지 수단이 있다. 첫째, 설정을 늘리고log4j가 다른classloader의 초기화를 무시하도록 한다.log4j 프로필에 추가
-XX:MaxPermSize=512m -Xmx512m -Denv=DEV -Dlog4j.ignoreTCL=true

됐어.일부 버전의 log4j 오류 정보에서는 다음 웹 주소도 언급됩니다.http://logging.apache.org/log4j/1.2/faq.html, 위의 속성에 대한 소개가 있습니다.둘째, 로그4j 라인을 초기화하는classloader를 수정합니다.log4j는 현재 라인 상하문의classloader로 설정을 초기화합니다. 그래서 제 샌드박스 응용 프로그램에서log4j의jar는 URLClassLoader에 의해 불러왔지만 불러오는 라인은 WebApp에 있는 라인인지 WebApp의 ClassLoader에 있는 라인인지 위의 알림 메시지가 나타납니다.따라서 우리는 다음 코드를 통과해야 한다.
Thread.currentThread().setContextClassLoader(urlclassLoader);

현재 스레드의 컨텍스트 로더를 샌드박스의 ClassLoader로 변경하면 됩니다.
두 가지 해결 방식을 너는 필요에 따라 선택할 수 있다.

좋은 웹페이지 즐겨찾기