본문 바로가기
Programing/Java

slf4j 란?

by Tomining 2016. 1. 20.

공식 페이지에서 아래와 같이 slf4j 를 정의하고 있다.

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks (e.g. java.util.logging, logback, log4j) allowing the end user to plug in the desired logging framework at deployment time.

Simple Logging Facade for Java 의 약자로 logging framework 들을 추상화 해 놓은 것이다. Facade Pattern 을 적용한 logging framework 이다.

Facade Pattern 이란? 통합된 인터페이스를 제공할 수 있는 패턴으로 상세한 내용은 wiki 페이지를 참고하면 된다.



slf4j 는 추상 로깅 프레임워크이기 때문에 단독으로는 로깅을 하지 않는다.(그림참조)
보통은 log4j 나 logback 을 함께 사용한다.

slf4j 의 특징으로는 아래와 같다.
  • 개발시점에 logging framework 을 선택할 수 있다.
  • jvm 에 의해 유효성 체크가 되며, 바인딩 된 logging framework 이 없다면 아무런 동작을 하지 않는다.
  • log4j 나 logback 같은 logging framework 을 지원한다.
  • 기존 legacy logging api 를 지원하며, slf4j 로 migration 도 지원한다.
  • 인자형 로그 메시지를 지원한다.
    ex) LOGGER.debug(“hello {}”, “world”);

사용법(slf4j + logback)

<dependencies>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.10</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>

import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created by NAVER on 2016. 1. 8..
 */
public class LoggingTest {
    private static final Logger LOGGER = LoggerFactory.getLogger(LoggingTest.class);

    /**
     * 인자형 로그 메시지
     */
    @Test
    public void parameterizedLoggingMessage() {
        String message = "world!";
        LOGGER.debug("Hello {}", message);
    }

    /**
     * LOGGER.isDebugable()
     */
    @Test
    public void logLevel() {
        String message = "LogLevel is {}";
        LOGGER.debug(message, "debug");
        LOGGER.info(message, "info");
        LOGGER.warn(message, "warn");
    }
}

이 외에도 실무에 사용하기에 편한 특징들이 더 많이 있다.
개인적으로 제일 편했던 기능은 Logback 설정시 조건문을 사용할 수 있다는 것과 동적으로 JMX 를 이용하여 log level 을 변경할 수 있다는 것이다.
(log level 변경은 운영에서 사용하는 것은 권장하지 않는다.)



참고자료