Study/Java

[Logger] SLF4J 기초

black6765 2022. 12. 22. 22:28

개요

  • Java의 로그 라이브러리에는 대표적으로 slf4j, log4j2(log4j), logback이 있다
    • 여기서 slf4j는 인터페이스 역할, log4j2 / logback은 구현체 역할이라고 보면 된다
    • slf4j를 활용하면 log4j2 <-> logback 간의 마이그레이션을 간단히 할 수 있다
      • 인터페이스의 역할
  • 일반적으로 slf4j에 logback 또는 log4j2 둘 중 하나를 사용한다

 

SLF4J(Simple Logging Facade For Java)

특징

  • slf4j는 로깅에 대한 추상 레이어를 제공하는 인터페이스의 모음이다
  • Facade 디자인 패턴이 적용되어 있다
  • 구현 클래스를 사용자가 설정할 수 있다

 

SLF4J의 세 가지 모듈

1. SLF4J API

  • SLF4J를 사용하기 위한 인터페이스를 제공한다
  • slf4j-api-{version}.jar를 통해 사용한다

 

2. SLF4J Binding(2.0.0 버전부터 Provider)

  • SLF4J 2.0.0 버전부터는 Binding이라는 용어가 Provider로 변경되었다.
  • slf4j 바인딩은 하나만 사용해야 한다
  • SLF4J 인터페이스를 로깅 구현체와 연결하는 역할
  • SLF4J Binding의 종류
    • slf4j-log4j12-{version}.jar
      • log4j와 log4j2에 대한 바인딩
      • log4j (log4j 1.x)에 대한 지원 중단
        • log4j 1.x가 2015년에 EOL 되었고, 2022년 SLF4j 1.7.35부터는 log4j에 대한 것은 빌드 시 자동으로 slf4j-reload4j 모듈로 리다이렉션 됨
        • log4j 1.x를 사용하고 싶다면 slf4j-reload4j를 사용하는 것이 좋음
    • slf4j-reload4j-{version}.jar
      • log4j 1.2.7의 대체
    • slf4j-jdk14-{version}.jar
      • JDK 1.4 로깅(java.util.logging)에 대한 바인딩/공급자
    • logback-classic-{version}.jar + logback-core-{version}.jar
      • Logback의 클래스는 SLF4J의 인터페이스를 직접 구현한 것
      • version = 1.4.x : 구현체로 logback을 사용하고, Jakarta EE를 사용할 때의 바인딩
      • version = 1.3.x : 구현체로 logback을 사용하고, Javax EE를 사용할 때의 바인딩

 

3. SLF4J Bridging Modules

  • 다른 로깅 API로 로거를 호출할 때 SLF4J 인터페이스로 연결하여 대신 처리할 수 있도록 하는 역할

 

사용 예제(maven)

pom.xml

<dependencies>

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

</dependencies>
  • slf4j에 대한 dependency를 추가
  • pom.xml을 변경한 후에는 반드시 변경사항을 반영해주어야 한다
    • 인텔리제이 기준 우측 상단의 “Load Maven Changes”을 클릭하거나 <Ctrl + Shift + O>를 입력
package org.example;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Main {

    private final static Logger logger = LoggerFactory.getLogger(Main.class);

    public void doSomething() {
        logger.info("Logging Something");
    }

    public static void main(String[] args) {
        new Main().doSomething();
    }
}
  • slf4를 사용하여 로그 출력 시도
SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See <https://www.slf4j.org/codes.html#noProviders> for further details.
  • 이와 같은 오류 메시지가 출력되며 로깅이 되지 않는다
    • SLF4J 2.0.0 버전 이상부터는 binding이라는 용어가 provider로 대체되었다
  • 그 이유는 SLF4J는 인터페이스 역할이기 때문에 구현체가 필요하기 때문이다
  • 이를 위해서는 SLF4J Binding jar 파일을 정확히 1개 두어야 한다
    • 여기서는 logback에 대한 바인딩인 logback-classic을 사용하여 진행

pom.xml에 logback dependency 추가

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.4.5</version>
</dependency>
  • 예제에서는 1.4.5 버전을 사용

출력 결과

17:24:49.264 [main] INFO org.example.Main - Logging Something

 

참고 자료