Application Servers & Java

[장애 사례] SLF4J: Class path contains multiple SLF4J bindings 오류

midworker 2025. 5. 15. 18:54
반응형

[장애 사례] SLF4J: Class path contains multiple SLF4J bindings 오류

애플리케이션을 WAS에 배포한 후 다음과 같은 SLF4J 관련 로그가 출력된다면?


✅ 에러 메시지 요약

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [logback-classic-1.1.2.jar]
SLF4J: Found binding in [slf4j-log4j12-1.6.2.jar]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings

✅ 원인

  • SLF4J는 로깅 인터페이스(facade)이며, 실제 로그 출력은 별도의 구현체가 담당합니다
  • slf4j-api는 하나지만, 구현체인 다음 두 개가 동시에 클래스패스에 포함된 상태입니다:
충돌된 구현체 설명
logback-classic-1.1.2.jar Logback 기반 로깅
slf4j-log4j12-1.6.2.jar Log4j 기반 로깅 연동

→ SLF4J는 오직 하나의 구현체만 존재해야 함


✅ 실제 경로 예시

vfs:/app/webapp/WEB-INF/lib/logback-classic-1.1.2.jar
vfs:/app/webapp/WEB-INF/lib/slf4j-log4j12-1.6.2.jar

✅ 해결 방법

✔ 1. 구현체 하나만 선택

  • Logback을 사용할 경우:

    ✅ 유지: logback-classic, logback-core, slf4j-api
    ❌ 제거: slf4j-log4j12, log4j.jar

  • Log4j를 사용할 경우:

    ✅ 유지: slf4j-log4j12, log4j.jar, slf4j-api
    ❌ 제거: logback-classic, logback-core


✔ 2. 의존성 관리 (Maven 예시)

<dependency>
  <groupId>ch.qos.logback</groupId>
  <artifactId>logback-classic</artifactId>
  <version>1.2.11</version>
</dependency>

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-api</artifactId>
  <version>1.7.36</version>
</dependency>

→ 다른 라이브러리에서 slf4j-log4j12가 포함될 경우 exclusions로 제거


✔ 3. Gradle 예시

configurations.all {
    exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}

✅ SLF4J 로딩 우선순위 팁

  • SLF4J는 클래스패스에 존재하는 첫 번째 구현체를 로딩
  • 하지만 여러 개가 존재하면 경고 로그만 출력되고, 동작은 예측 불가 (순서 의존성 발생)

✅ 마무리

SLF4J 환경에서 multiple bindings 경고는 다음 3가지로 해결할 수 있습니다:

  1. 구현체는 반드시 하나만 포함할 것
  2. 빌드 도구에서 의존성 충돌 제거
  3. WAS 배포 전 WEB-INF/lib/ 내 중복 jar 점검

반응형