2008-11-05 2 views
6

서블릿 애플리케이션에는 여러 라이브러리 .jars가 포함되어 있으며 그 중 일부에는 log4j.xml 또는 log4j.properties 파일이 포함되어 있습니다. 나는 log4j가 내 log4j.xml을 먼저 찾도록하고 싶다! 서블릿에서 다양한 classpath 요소의 우선 순위에 대한 특정 사양을 검색하려고했습니다 (예 : WEB-INF/classes가 항상 WEB-INF/lib 앞에 있습니까?) 또는 서블릿의 클래스 로더를 구성하거나 조정하여 주어진 리소스 디렉토리는 classpath의 초기에 나타납니다. 지금까지, 나는 공백을 그렸다. servlet .war 파일이 클래스 로더를 통해 올바른 log4j.xml을로드하는지 확인하는 방법에 대한 제안 사항은 무엇입니까?서블릿에서 클래스 경로 제어

답변

4

내가 알기 론, 클래스 패스로부터의 자원 선택은 (개발자의 관점에서 볼 때) 결정적이지 않다. 일관되게 동일한 파일이로드 된 경우에도 동작이 변경 될 수 있습니다. 1. 현재 컨테이너의 버전을 업그레이드 할 때. 2. 컨테이너를 전환 한 경우.

가장 간단한 해결책은 에 라이브러리 jar에서 포함 된 log4j 구성 파일을 제거하는 것입니다. log4j 설정을 포함시키는 것이 거의 불가능합니다 ...

개발 한 써드 파티 jar 또는 jar 파일입니까?

+0

에 있어야하므로 제 3 자이므로 문제가 있습니다. –

+0

아마도 무자비한 소리가 날 위험이 있습니다. 질문에 이름을 붙이고 부끄러워해야하고, 버그를 신고해야합니다 ... – johnstok

+0

제 3 자 jar 파일에서 log4j 설정 파일을 수동으로 제거하는 것이 좋습니다. 의존성을 관리하기 위해 maven, ivy 등을 사용한다면 이것은 고통스런 일입니다. – johnstok

-1

CLASSPATH에 log4j.properties가 있어야합니다. 가장 좋은 장소는 WEB-INF/classes에 있습니다.

또한 log4j.jar 버전을 사용해야합니다. 그래서 WEB-INF/lib에 넣으십시오. 단지 톰캣 폴더에서 하나를 사용하지 않도록하십시오. 이상한 클래스 로딩 문제를 일으킬 수 있습니다.

+0

210. WEB-INF/classes가 WEB-INF/lib보다 먼저 클래스 경로에 있어야합니까? 내 log4j.xml이 WEB-INF/classes가 아닌 다른 디렉토리에 있도록하려면 어떻게해야합니까? 결국 클래스가 아닙니다. –

+0

하지만 클래스 패스 – Marko

3

우리는 web.xml 파일의 Spring Log4jConfigListener을 사용합니다.

당신은 컨텍스트 매개 변수로의 log4j 설정 파일의 위치를 ​​지정할 수 있습니다, 즉, 당신이 당신을위한 옵션이 될 것인가 /WEB-INF/log4j.xml

로 설정할 수 있습니다? Spring을 사용하지 않는다면 Log4j 위치를 프로그램 적으로 설정할 수 있다는 것도 알고 있습니다.

+0

봄은이 프로젝트에서 옵션이 아니지만 미래를 염두에 두는 데 유용한 팁이므로 감사합니다! –

1

내 경험상 WEB-INF/classes는 일반적으로 WEB-INF/lib의 jar보다 우선 순위가 높지만 사용하는 서블릿 컨테이너에 따라 다르다 (예를 들어 JRun의 동작을 파악할 수 없다) . 당신이 사용하고있는 컨테이너를 알려주면 엄청난 도움이 될 것입니다.

또한, 문제가되는 log4j 구성이 WEB-INF/lib의 jar 파일에 있는지 확인하십시오. 일반적으로 서블릿 컨테이너 상황에서 클래스 경로 문제가 발생하면 웹 응용 프로그램의 외부에있는 라이브러리에 있기 때문입니다. 웹 응용 프로그램 클래스 로더는 컨테이너의 클래스 로더 (SRV.9.7.2)에 위임하기 전에 자신의 클래스를로드하는 것이을 권장하지만,이 자바 스펙에 카운터이기 때문에, 모든 공급 업체는 기본적으로이 작업을 수행하지

서블릿 사양 (사실 Tomcat이 내가 사용했던 유일한 컨테이너이다.). 즉, 항상 컨테이너의 웹 앱 클래스 로딩 동작을 구성 할 수 있습니다. 어떤 컨테이너를 사용하고 있는지 알려 주시면 도움을 드릴 수 있습니다 (특히 WebLogic, WebSphere, Glassfish 및 JRun에서이 작업을 성공적으로 수행했습니다).

+0

Hi Jack, 현재 Tomcat 6 (tomcat6-6.0.18-1.1.fc9.noarch) 및 Jetty 6.1.11을 사용하고 있습니다. 그리고 아니, 나는 충돌이 log4j 설정에서 내 .jars에서 온다고 전적으로 확신하지 못합니다. 우리는 이상한 로깅 동작을 가지고 있으며, 상충되는 구성은 좋은 가설처럼 보입니다. –

+0

나는 Jetty를 사용하지 않았지만 Tomcat에서는 클래스 로더 설정을 문제로 배제 할 수있다. log4j.jar은 WEB-INF/lib 디렉토리에 있습니까? –

1

클래스 경로를 제어 할 수없는 경우 Tomcat이 설정하기 때문에 최소한 log4j.configuration에 대한 시스템 속성을 설정할 수 있습니까? 나는 그 재산에 의해 가리키는 위치가 classpath 바깥에 놓일 수 있다고 믿습니다.

그렇지 않은 경우 다른 방법으로는 구성 코드를 응용 프로그램 코드에서 명시 적으로 실행하는 것이 좋습니다.

15

톰캣 8.5

Ditto Tomcat 8.0.

문서보기 : Class Loader HOW-TO.

톰캣 8.0

대답은 톰캣 문서 페이지, Class Loader HOW-TO에서 가져온 간단합니다. 특히 디렉토리/폴더 /WEB-INF/의 사용에주의하십시오. 웹 응용 프로그램의

    당신의 JVM의
  • 부트 스트랩 클래스
  • /WEB-INF/classes :

    따라서, 웹 애플리케이션의 관점에서, 클래스 나 자원 로딩이 순서대로 다음 저장소에 보이는

  • 웹 응용 프로그램의
  • 시스템 클래스 로더 클래스 (위에서 설명)
  • (위에서 설명한)개 일반적인 클래스 로더 클래스

웹 애플리케이션 클래스 로더는 <Loader delegate="true"/>configured 경우 다음 순서가된다 :

이 이
    이 당신의 JVM의
  • 부트 스트랩 클래스가
  • 시스템 클래스 로더 클래스 (설명 위의)
  • 일반적인 클래스 로더 클래스 (위에서 설명한)
  • /WEB-INF/classes 웹 응용 프로그램
  • 웹 응용 프로그램의
  • /WEB-INF/lib/*.jar

톰캣 6

톰캣 6 페이지, Class Loader HOW-TO에서 발췌.

가 이
    당신의 JVM의
  • 부트 스트랩 클래스가
  • 시스템 클래스 로더 클래스 (설명 :

    따라서, 웹 애플리케이션의 관점에서, 클래스 나 자원 로딩이 순서대로 다음 저장소에 보이는 위의) 웹 응용 프로그램의

  • /WEB-INF/classes
  • 웹 응용 프로그램 정말 내가 묻는 질문에 대답하지 않습니다
  • $CATALINA_HOME/lib
  • $CATALINA_HOME/lib/*.jar