개발자의 오르막

[Log4j 1.2.16-ver Json Layout 적용기 #02] 기존 공통 라이브러리 의존성에 따른 Log4j2 Mig 이슈 본문

Java

[Log4j 1.2.16-ver Json Layout 적용기 #02] 기존 공통 라이브러리 의존성에 따른 Log4j2 Mig 이슈

계단 2022. 7. 11. 14:28

프로젝트 에서 log4j-1.12.16 → log4j-2.12.4 로 마이그 작업 중 이슈 발생

NoClassDefFoundError: Lorg/apache/log4j/Logger;

이유는 프로젝트 에서 공통 Utils.jar 파일을 의존하고 있는데, 공통 Utils.jar 파일이 log4j-1.12.16 라이브러리를 의존하고 있음

 

따라서, log4j-1.12.16 라이브러리를 삭제하면 kollus_utils.jar 파일에서 해당 클래스를 호출할 때 위의 이슈가 발생함.

 

quartz-all-2.1.3.jar 과 slf4j-api-1.6.1.jar 를 의존하고 있음

  • StdSchedulerFactory.class 가 org.slf4j.Logger 를 의존하고 있음
java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

따라서 slf4j-log4j12-1.6.1.jar 파일도 삭제하게 되면 위와 같은 오류 메시지가 발생함

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/Yunho/workspace/java/reference/MediaWatcher-v2/libs/log4j-slf4j-impl-2.12.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/Yunho/workspace/java/reference/MediaWatcher-v2/libs/slf4j-log4j12-1.6.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See <http://www.slf4j.org/codes.html#multiple_bindings> for an explanation.

 

log4j-slf4j-impl-2.12.4.jar 파일과 slf4j-api-1.6.1.jar 파일을 같이 쓰게 되면 Multiple SLF4J bindings 오류가 발생하게 됨

log4j-1.2.16 과 log4j-2.12.4 가 동시에 존재하면서, log4j-slf4j-impl-2.12.4.jar 는 없어야 한다.

 

결론

1) 결국, 공통 Utils.jar 파일에 종속되는 클래스를 발라내거나, version 이 섞일 수 밖에 없는 형태가 되는데, 이는 RunTimeException 이 발생할 수 있어, 매우 불안정임

2) 또한 프로젝트 에서 StdSchedulerFactory 를 통한 스케줄링 로직이 있으나, 이 로직은 slf4j-api-1.6.1.jar 파일 버전에 의존성을 갖고 있기 때문에 이 부분도 버전에 맞는 리팩토링이 필요함

 

 

따라서 Json Format 로그 지원은 1.2.16 version 의 log4j 와 호환되는 라이브러리 추가로 해결하고, log4j 라이브러리 2.x.x 대 변경은 프로젝트 버전 Up 을 통해 리팩토링으로 해결하는 것이 안전하다.

Comments