본문 바로가기
공부/프로그래밍

[log4j] SLF4J: Class path contains multiple SLF4J bindings. 에러

by demonic_ 2022. 1. 5.
반응형

log4j2 를 버전업 하는데 다음의 문제가 발생한다.

 

build.gradle (Gradle로 설정)

...
    implementation group: 'org.apache.logging.log4j', name: 'log4j-core', version: "2.17.1"
    implementation group: 'org.apache.logging.log4j', name: 'log4j-api', version: "2.17.1"
    implementation group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: "2.17.1"
...

에러메세지

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/dgpark/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j-impl/2.17.1/84692d456bcce689355d33d68167875e486954dd/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/dgpark/.gradle/caches/modules-2/files-2.1/ch.qos.logback/logback-classic/1.2.3/7c4f3c474fb2c041d8028740440937705ebb473a/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Exception in thread "main" java.lang.ExceptionInInitializerError
	at org.springframework.boot.builder.SpringApplicationBuilder.createSpringApplication(SpringApplicationBuilder.java:109)
	at org.springframework.boot.builder.SpringApplicationBuilder.<init>(SpringApplicationBuilder.java:97)
	at com.nate.uapsof.UapsMainSpring.init(UapsMainSpring.java:42)
	at com.nate.uapsof.UapsMainSpring.<init>(UapsMainSpring.java:31)
	at com.nate.uapsof.UapsMainSpring.getInstance(UapsMainSpring.java:36)
	at com.widetns.tester.Main.main(Main.java:9)
Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
	at org.apache.logging.slf4j.Log4jLoggerFactory.validateContext(Log4jLoggerFactory.java:60)
	at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:44)
	at org.apache.logging.slf4j.Log4jLoggerFactory.newLogger(Log4jLoggerFactory.java:33)
	at org.apache.logging.log4j.spi.AbstractLoggerAdapter.getLogger(AbstractLoggerAdapter.java:53)
	at org.apache.logging.slf4j.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:33)
	at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:363)
	at org.apache.commons.logging.LogAdapter$Slf4jAdapter.createLocationAwareLog(LogAdapter.java:130)
	at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:91)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67)
	at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59)
	at org.springframework.boot.SpringApplication.<clinit>(SpringApplication.java:206)
	... 6 more

Process finished with exit code 1

 

Spring boot의 경우 기본 logging 설정은 logback 이다. 그런데 log4j2 를 사용하려다보니 에러가 발생한 것이다. 해킹이슈로 인해 log4j2 버전을 올렸더니 기존 로깅 시스템과 문제가 발생한 것.

 

여기서 log4j2를 쓸건지 logback을 사용할 것인지 판단이 필요하지만, 우선 포스팅은 log4j2 를 선택했다는 가정하에 진행한다.

 

우선 로그를 보면 multiple SLF4J bindings 이라고 떠 있는데, log4j와 logback 이 충돌되어 그렇다.

log4j는 직접 설정했지만, 다른 dependency를 추가하면서 logback 이 자동주입되 둘이 충돌되는 것이다.

우선 logback 을 제외 시키도록 설정한다

configurations {
	all {
		exclude group: 'ch.qos.logback', module: 'logback-classic'
	}
}

 

그랬더니 이번에는 다른 에러문구가 보인다. 첫번째 에러는 해결이 되었는데 아래 문제가 생긴 것이다.

 

에러메세지

 

Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4j
...

 

log4j-slf4j-impl 과 log4j-to-slf4j 는 함께 존재할 수 없다는 문구다.

그래서 dependency에 추가했던 log4j-slf4j-impl 를 제거해보았지만 여전했다. 다른 dependency 떄문에 불러와지는 듯 하다.

 

그래서 log4j-to-slf4j 를 제외하기로 한다.

 

configurations { 
	all {
	    exclude group: 'ch.qos.logback', module: 'logback-classic'
	    exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
    }
}

또는 spring logging 을 제거해도 된다

configurations { 
	all {
	    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
    }
}

 

 

끝.

반응형

댓글