SLF4J의 개념과 설정 방법을 이해한다.

Goal

  • Logging이란
  • SLF4J(Simple Logging Facade for Java)란
    • 1) SLF4J API
    • 2) SLF4J Binding
    • 3) SLF4J Bridging Modules
  • SLF4J 특징

Logging이란

프로그램 개발 중이나 완료 후 발생할 수 있는 오류에 대해 디버깅하거나 운영 중인 프로그램 상태를 모니터링 하기 위해 필요한 정보(로그)를 기록하는 것

VS Debuggger

VS Plain Output(System.out.println())


SLF4J(Simple Logging Facade for Java)란

Log4J 또는 Logback과 같은 백엔드 Logging Framework의 facade pattern

참고 facade pattern

1) SLF4J API - “Hello World” using SLF4J

1. class path에 slf4j-api-1.7.25.jar 추가 (pom.xml)

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

2. HelloWorld 클래스를 컴파일하고 실행

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class HelloWorld {   
    public static void main(String[] args) {      
        Logger logger = LoggerFactory.getLogger(HelloWorld.class);  
        logger.info("Hello World");   
    }
}
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.

2) SLF4J Binding

SLF4J binding 종류

SLF4J binding(.jar)) Description
slf4j-log4j12-{version}.jar 널리 사용되는 로깅 프레임워크인 log4j 버전 1.2에 대한 바인딩.
또한 log4j.jar을 클래스 경로에 배치해야 한다.
slf4j-jdk14-{version}.jar java.util.logging(JDK1.4 로깅)에 대한 바인딩.
slf4j-nop-{version}.jar NOP에 대한 바인딩. 모든 로깅을 자동으로 삭제합니다.
slf4j-simple-{version}.jar 모든 이벤트를 System.err에 출력하는 단순 구현 바인딩.
INFO 이상의 메시지만 출력되므로 작은 응용 프로그램에서 유용하다.
slf4j-jcl-{version}.jar JCL(Jakarta Commons Logging)에 대한 바인딩.
모든 SLF4J 로깅을 JCL에 위임한다.
logback-classic-{version}.jar (logback-core-{version}.jar 필요) native implement
Logback의 클래스는 SLF4J의 인터페이스를 직접 구현한 것으로, SLF4J 프로젝트 외부에 SLF4J 바인딩이 있다.
따라서 Logback과 함께 SLF4J를 사용하면 메모리 및 오버헤드가 발생하지 않는다.
Logback의 ch.qos.logback.classic.Logger 클래스는 SLF4J의 org.slf4j.Logger 인터페이스를 직접 구현한 것이다.

예시: SLF4J binding with Logback

<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
    </exclusions>
    <scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>

3) SLF4J Bridging Modules

Consolidate logging via SLF4J

Bridging legacy logging APIs

SLF4J가 제공하는 Bridge의 종류

SLF4J binding(.jar)) Description
jcl-over-slf4j.jar JCL API에 의존하는 클래스들을 손상시키지 않고 JCL로 들어오는 호출을 JCL-over-SLF4J를 이용해서 SLF4J API를 호출한다.
즉, 이 모듈을 사용하면 JCL을 사용하는 기존 소프트웨어와의 호환성을 손상시키지 않으면서 프로젝트를 SLF4J로 단편적으로 마이그레이션할 수 있다.
log4j-over-slf4j.jar 이 모듈을 사용하면 log4j 호출을 SLF4J API로 리디렉션할 수 있다.
jul-to-slf4j.jar 이 모듈을 사용하면 java.util.logging 호출을 SLF4J API로 리디렉션할 수 있다.

참고 JCL(Jakarta Commons Logging)

예시: Logging with SLF4J and Logback

... 
    위의 SLF4J binding with Logback 내용과 동일 
    logback-classic
    logback-core
    slf4j-api
...
<!-- https://mvnrepository.com/artifact/org.slf4j/log4j-over-slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/jcl-over-slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/jul-to-slf4j -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>1.7.25</version>
</dependency>
  1. SLF4J API (인터페이스)
    • 로깅에 대한 추상 레이어를 제공
    • 사용자가 이 interface를 통해 로깅 코드를 작성한다.
    • slf4j-api
  2. SLF4J Binding(.jar)
    • SLF4J 인터페이스를 로깅 구현체로 연결하는 어댑터 역할을 하는 라이브러리
    • SLF4J에 구현체(Logging Framework)를 바인딩하기 위해 사용한다.
    • 여러 바인딩 중 하나만 사용할 것
    • [Logback] logback-classic / [Log4J] slf4j-log4j12
  3. Logging Framework
    • 실제 로깅 코드를 실행할 Logging Framework를 정한다.
    • [Logback] logback-core / [Log4J] log4j-core
  4. SLF4J Bridging Module
    • 다른 로깅 API -> Bridge(redirect) -> SLF4J API
    • 다른 로깅 API로의 Logger 호출을 SLF4J 인터페이스로 연결(redirect)하여 SLF4J API가 대신 처리할 수 있도록 하는 일종의 어댑터 역할을 하는 라이브러리
    • log4j-over-slf4j, jcl-over-slf4j, jul-to-slf4j

SLF4J 특징

  1. 배포시 Logging Framework 선택 가능
    • compile time에 오직 하나의 Logging Framework를 사용하도록 바인딩
  2. 빠른 속도로 작동
    • 클래스가 JVM에 의해 로드되는 방식으로 인해 프레임워크 바인딩은 초기에 자동으로 확인된다.
  3. 널리 사용되는 Logging Framework를 위한 바인딩 제공
    • log4j, java.util.logging, 단순 로깅 및 NOP를 지원
    • logback 프로젝트는 기본적으로 SLF4J를 지원
  4. Bridging legacy logging API
    • log4j API, JCL(Jakarta Commons Logging) API 및 java.util.logging API에 대한 호출을 대신 SLF4J API에 대한 것처럼 리디렉션하는 여러 Bridging Modules을 제공
  5. Migrate your source code
    • SLF4J-Migrator utility를 사용하면 SLF4J를 사용하는 소스를 마이그레이션할 수 있다.
  6. 매개 변수화된 로그 메시지 지원

관련된 Post

References