런타임중에 jboss에서 jboss-log4j.xml 설정 다시 읽기

예를들면 hot deploy 를 위해 이전 war 의 설정을 클리어하기 위해서는 어떻게 해야 할까?
물론 Logger 는 VM상의 Hashtable 에 카테고리이름에 1개의 Logger 가 설정되어 계속 사용되어지기 때문에 큰 문제없이 사용할 수 있을것이다.

그러나 Logger 를 계승하여 독자적인 MyLogger를 만들었다고 해보자.
이 MyLogger 가 war 안에 포함될 경우는 아래 2개의 문제점이 있다.

1. 2개의 war 에 각각 MyLogger가 포함되어 카테고리이름이 중복되는 경우 ClassCastException가 발생한다.
2. 1개의 war 를 사용해도 Hot Deploy 시에는 deploy 전과 후에 각각 다른 클래스가 생성되므로 ClassCastException가 발생한다.

위의 이유로 VM상의 Hashtable을 초기화함과 더불어 로그설정을 다시 읽어올 필요가 있다.
log4j.xml 에 정의된 category 는 로딩시에 Hashtable 에 자동 설정되므로 단지 Hierarchy.clear() 를 실행해서는 안된다.

물론 가장 좋은 방법은 LogManager나 LoggerRepository(Hierarchy)를 확장하면 되는데,
log4j 의 설계상 static 으로 되어 있고 수식자를 패키지로 제한하였기 때문에 거의 확장은 불가능하다.

그럼 여기서는 2번을 가정으로 하여 구현 방법을 알아본다.
먼저 첫번째 방법은 log4j 클래스만으로 구현하는 방법이다.

위의 방법은 JBoss 이외에서 유용할 것이다.
그리고 한가지 문제점은 VM옵션에 -Dorg.jboss.logging.Log4jService.catchSystemOut=false 를 지정해줘야 한다.

하지만, 보다 JBoss 스러운(?) 방법은 아래와 같다.

보는바와 같이 MBEAN을 이용하여 invoke 하는 방법이다.

This entry was posted in JBoss. Bookmark the permalink.