SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Java 애플리케이션을 실행하다보면 slf4j StaticLoggerBinder 클래스를 로드하지 못했다는 오류를 발생시키는 경우가 있다.
문제의 원인은 slf4j의 api만 의존성으로 포함하고 그 구현체 의존성을 포함하지 않았기 때문이다.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
slf4j 인터페이스에 호환되는 구현체에 해당하는 로깅 라이브러리를 의존성으로 포함시키면 해결된다. 아주 간단한 방법으로 slf4j-log4j12나 slf4j-simple을 추가하면 된다.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
그러나 이 구현체를 추천하지 않으니 아래 내용을 숙지하는 게 좋다.
요즘은 slf4j 계열의 구현체보다는 logback을 더 선호한다. 가장 널리 쓰이는 로깅 라이브러리 구현체라고 할 수 있다.
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.8</version>
</dependency>
pom.xml 설정 변경 후에 클린 컴파일이 필요하다.
클린 컴파일 후에도 증상이 재발한다면 IntelliJ와 같은 IDE를 재실행해 볼 필요가 있다.
Spring framework은 내부적으로 JCL(Java Common Logging) 인터페이스를 사용하는데 이 인터페이스에 호환되는 대표적인 구현체는 Log4J이다.
JCL로 구현된 로그는 주로 log4j를 이용해서 로깅되는데, 그러면 logback과 별도의 로깅으로 분리되는 셈이다. 모두 logback을 통해 로깅되기를 희망한다면 로깅 어댑터가 필요한데, 이 경우에 jcl-over-slf4j를 사용하면 된다.
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>1.7.7</version>
</dependency>
로깅 요청의 흐름은 다음과 같다.