보통 Spring Web MVC 에서 log4j 의 사용을 위해 web.xml 에 다음과 같이 설정파일을 불러올 위치를 지정해준다.

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>classpath:/resources/properties/log4j.properties</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>

WAS 가 가동되면 web.xml 설정에 따라서 log4j 의 설정값을 읽어서 정상적으로 로깅을 시작한다.

하지만 다음과 같이 Junit 를 통한 직접적인 테스트에서는 log4j가 올바르게 작동하지 않는다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:/resources/configs/DataBaseContext.xml",
           "classpath:/resources/configs/OzNoteContext.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class SqlMapNoteDaoImplTest {

    @Test
    public void testGetBoardList(){
        // 테스트 코드
    }

}

web.xml 을 읽어서 환경을 구성해줄 컨테이너가 없기 때문이다. 특별히 설정이 없는 경우 Spring 은 log4j 의 설정파일을 classpath root에서 파일을 찾아보고 없다면 경고 메시지만 보여주고 로깅은 하지 않는듯 싶다.

log4j:WARN No appenders could be found for logger(org.springframework.test.context.junit4.SpringJUnit4ClassRunner).
log4j:WARN Please initialize the log4j system properly.

그럴 경우에는 대비해서 Spring 은 ApplicationContext 에서 직접 log4j 의 설정파일을 위치를 받을 수 있는 클래스가 만들어져 있다.

org.springframework.util.Log4jConfigurer

위 클래스를 import 시킨 후 다음과 같이 사용 할 수 있다.

Log4jConfigurer.initLogging("classpath:resources/properties/log4j.properties");

Resource에서 쓰던 prefix들 classpath: 와 file:을 사용해서 프로퍼티 파일 위치를 알려주면 된다. 설정파일이 찾지 못한다면 FileNotFoundException 을 던지니 예외처리를 해주어야한다.




이 정보는 스프링 포럼을 통해서 알 수 있었습니다.
Posted by Arawn Trackback 0 : Comment 3