정말 황당한 현상이 발생했다. 바로 직전까지 잘 보이던 로그(commons-logging-1.1.1, log4j-1.2.16)가 갑자기 안보인다. 그래서 구글링도 해보고 Apache Commons Logging(JCL), Log4j 의 문서도 찾아 봤지만 내가 설정한 것과 별반 다를것이 없었다.
무려 2시간을 이것 저것 해보다가 아래와 같은 글을 볼 수 있었다.
WebSphere v7.0 에서 commons logging 이용 log4j 사용하기
일단 Apache 홈페이지에서 다운 받은 commons logging을 사용하여 WebSphere Application Server에서 돌릴경우 동작을 하지 않는 이유는 <WAS_HOME>/plugins/com.ibm.ws.prereq.commons-logging.jar 에 (WAS v7.0기준) 있는 org.apache.commons.logging.Log 클래스와 org.apache.commons.logging.LogFactory 클래스가 먼저 로딩이 되기 때문이다.
무려 2시간을 이것 저것 해보다가 아래와 같은 글을 볼 수 있었다.
WebSphere v7.0 에서 commons logging 이용 log4j 사용하기
commons logging을 통하여 log4j를 사용할때 클래스 로더 순서(모드)를 Parent Last로 놓아야 한다.
클래스 로더 순서에 대한 내용은 http://cafe.naver.com/devmaster/279 를 참고하세요.
Parent Last로 놓을 수 없는 경우에는 아래와 같은 방법을 사용한다.
일단 Apache 홈페이지에서 다운 받은 commons logging을 사용하여 WebSphere Application Server에서 돌릴경우 동작을 하지 않는 이유는 <WAS_HOME>/plugins/com.ibm.ws.prereq.commons-logging.jar 에 (WAS v7.0기준) 있는 org.apache.commons.logging.Log 클래스와 org.apache.commons.logging.LogFactory 클래스가 먼저 로딩이 되기 때문이다.
후략 ...
참고: http://www.websphere.pe.kr/xe/?mid=was_info&page=4&document_srl=2668
즉, 동일한 클래스가 존재하고 원래의 클래스보다 다른 클래스가 먼저 로딩이 되기 때문에 동작하지 않을 것이라는 말인것 같다.
그래서 찾아봤다.
LogFactory로 검색을 해보면 두개가 검색이 된다.
하나는 commons-logging-1.1.1.jar 이고 또 하나는 jcl-over-slf4j-1.5.8.jar 이다.
흠. jcl-over-slf4j-1.5.8.jar 가 왜 갑자기 딸려 들어 왔을까? 궁금했다.
위의 종속관계 그래프에서 알 수 있듯이 로그가 안나오기 전에 Apache Tiles2를 적용하는 과정에서 jcl-over-slf4j-1.5.8.jar 가 딸려왔고 잘나오던 로그가 갑자기 먹통이 되었었던것 같다.
그래서 다음과 같이 메이븐 pom.xml 설정을 변경했다.
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${tiles.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>
적용결과 로그가 잘나온다. 예전에도 이런일이 있었는데 그땐 commons-logging을 포기하고 Log4j로 선언했던것 같다. 이 글이 많은 사람들에게 해결의 실마리가 되었으면한다.
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${tiles.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</exclusion>
</exclusions>
</dependency>