SLF4J 개념 및 동작과정

2023. 4. 23. 23:58JAVA/Spring

1. System.out.println 문제점

  • 로그 라이브러리는 로그 레벨을 설정할 수 있기 때문에 특정 레벨 이상의 로그만 출력할 수 있지만 출력문은 레벨 상관없이 출력됩니다.
  • 로그 라이브러리는 파일이나 외부 서버에 저장할 수 있는 반면 출력문은 이러한 기록을 파일로 기록하기 어렵습니다.
  • 로그 라이브러리를 사용하는 것보다 출력문을 사용하면 성능 저하가 발생할 수 있습니다. 
  • 개발 중에 추가한 출력문을 주석 처리하거나 제거해야 할 수 있습니다.

 

2. Logging 라이브러리

  • 로깅 라이브러리는 애플리케이션에서 발생하는 이벤트를 기록하고 추적할 수 있는 도구입니다.
  • 로깅 라이브러리를 활용하여 디버깅 메시지를 레벨로 구분할 수 있으며, 레벨에 따라 로깅 메시지의 출력 유무를 결정할 수 있습니다.
  • 대표적 로깅 라이브러리 : Log4j, Logback, SLF4J, java.util.logging
  • log4j를 만든 “Ceki Gülcü“는 logging 라이브러리를 한 단계 업그레이드하기 위해 slf4j와 logback을 만들었습니다.

 

3. SLF4J 라이브러리

  • SLF4J(Simple Logging Facade for Java)
  • java.util.logging, logback, log4j와 같은 다양한 로깅 프레임워크에 대한 인터페이스 역할을 하는 라이브러리입니다.
  • SLF4J는 추상 클래스이기 때문에 단독으로 사용할 수 없습니다.
  • 클라이언트는 SLF4J API를 호출하기만 하면 SLF4J API를 구현한 실제 로깅 프레임워크를 몰라도 됩니다.

 

3.1 SLF4J 동작과정

SLF4J 전체적인 과정

1. 클라이언트 코드에서 SLF4J API를 사용하여 로깅 코드를 작성합니다.

2. 배포할때, 바인딩된 로깅 프레임워크(Logging Framework)가 실제 로깅 코드를 수행합니다.

 

 

예를 들어 이전 레거시 프레임워크인 Log4J를 사용한다고 가정합니다. 그리고 SLF4J API의 구현체는 Logback 로깅 프레임워크를 사용한다고 가정합니다.

 

SLF4J 상세 과정

1. 클라이언트 코드에서 Log4J API를 호출하여 로깅 기능을 호출합니다.

2. Bridge라는 모듈에서 log4j-over-slf4j.jar 파일을 이용하여 Log4J API 호출을 SLF4J 인터페이스로 연결하여 SLF4J가 API 대신 처리할 수 있도록 수행합니다.

3. Binding 모듈에서는 SLF4J API를 구현한 클래스에서 Binding으로 연결된 Logger의 API를 호출합니다. 

 

3.2 SLF4J 제공 모듈 : Bridging

  • Bridging 모듈은 SLF4J를 제외한 다른 로깅 API(Log4J, JUL, JCL)의 Logger 호출을 SLF4J 인터페이스로 연결하여 SLF4J API가 대신 처리할 수 있도록 하는 어댑터 역할을 하는 라이브러리입니다.
  • Briding 모듈을 제공하는 이유는 이전 레거시 로깅 프레임워크를 지원하여 SLF4J 인터페이스를 구현한 Logback과 같은 성능이 더 좋은 로깅 프레임워크로 실행하기 위해서입니다.
  • 주의점 : Bridge는 여러개여도 관계없지만 Bridge와 Binding에 같은 종류의 프레임워크를 사용하면 안됩니다. 예를 들어 Log4J API를 호출하고 바인딩된 프레임워크에 Log4J 로깅 프레임워크를 사용하면 안됩니다.

 

3.3 SLF4J 제공 모듈 : SLF4J API

  • 로깅 기능에 역할을 수행하는 추상 메소드를 제공합니다.
  • 추상 클래스이기 때문에 SLF4J 라이브러리만 단독으로 사용할 수없고 구현체인 로깅 프레임워크가 있어야 합니다. 대표적으로 Logback 로깅 프레임워크가 존재합니다.
  • 주의점 : 하나의 로깅 API에 하나의 Binding을 두어야 합니다. 예를 들어 위 그림에서 로깅 API로 Log4J를 호출한다면 Logback 로깅 프레임워크에 바인딩 될수 있습니다.

3.4 SLF4J 제공 모듈 : Binding(.jar)

  • SLF4J 인터페이스를 로깅 구현체(Logging Framework)와 연결하는 어댑터 역할을 수행하는 라이브러리입니다.
  • SLF4J API를 구현한 클래스에서 Binding 모듈로 연결된 Logger의 API를 호출합니다.
    • 예를 들어 Log4J API를 호출하면 SLF4J API로 변환하고 SLF4J API의 구현체인 Logback 로깅 프레임워크에 Binding 될 수 있습니다.
  • 주의점 : 하나의 SLF4J API에 하나의 Binding을 두어야합니다.

 

References

logging framework 개념 및 기본 설정
[Logging] SLF4J란?