본문 바로가기

3.구현/Java or Kotlin

SLF4J simple tutorial

공식홈페이지:

http://www.slf4j.org/

Simple Logging Facade for Java (SLF4J)라는 다양한 log api에 대해서 간단한 facade를 제공한다.
즉, 다양한 log library를 하나의 객체로 통합해준다.

유명한 log4j, JDK, JCL 등의 log library를 따로 관리할 필요없이 slf4j로 관리가 가능하다.

작성자: Ospace(ospace114@naver.컴), 2008.12.18(목)

그럼 사용해보자. 지금 사용할 slf4j의 jar파일은 다음과 같다.

  • slf4j-api-1.4.3.jar: facade 인터페이스 제공. 기본적으로 포함될 클래스 라이브러리
  • slf4j-nop-1.4.3.jar: facade 구현 클래스로 아무런 작업을 하지 않음
  • slf4j-simple-1.4.3.jar: facade 구현 클래스로 간단한 log 작업
  • slf4j-jdk14-1.4.3.jar: facade 구현 클래스로 jdk에 있는 log 작업 연결
  • slf4j-log4j12-1.4.3.jar: facade 구현 클래스로 log4j의 log 작업 연결

Note: slf4j는 facade하지만 bridge 패턴도 있다. 즉, 내부적으로 log 처리를 직접하기 보다는 각 log library에 api를 호출해서 log를 처리한다.

예제

아래는 간단한 테스트 코드이다. 아래는 공식 홈페이지에서 제공되는 코드이다.

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

public class Main {
    final Logger logger = LoggerFactory.getLogger(Main.class);
    Integer t;
    Integer oldT;

    public Main() {
        t = new Integer(0);
        oldT = t;
    }

    public void setTemperature(Integer temperature) {
        oldT = t;
        t = temperature;
        logger.debug("Temperature set to{}. Old temperature was {}.", t, oldT);

        if(temperature.intValue() > 50) {
          logger.info("Temperature has risen above 50 degrees.");
        }
    }

    public static void main(String[] args) {
        Main test = new Main();
        test.setTemperature(new Integer(10));
        test.setTemperature(new Integer(60));
    } 
}

환경설정

보통 내려받은 라이브러리를 사용하기 위해 해당 라이브러리 안에 있는 jar파일을 모두 포함시킨다. 그러나 slf4j에서는그렇게 해서는 않된다. 앞에 나왔던 모든 jar를 포함시키게 되면 예외가 발생하면서 프로그램이 종료가 된다. 운이 좋으면 그렇지 않을 수 있다.
운이 좋다는 말은 클래스 라이브러리 순서가 절묘하게 배치되었다는 말이다. 그러나 이건 나중에 문제 발생가능성이 다분하다.

그러면 어떻게 할까?

필요한 jar파일만을 선택하여 추가해야 한다.

먼저 기본적으로 추가되야하는 jar파일은 다음과 같다. 여기서 slf4j에서 제공되는 api가 있다.

slf4j-api-1.4.3.jar

이 파일만 있으면 일단 컴파일은 문제 없다. 그러나 실행에 문제가 있다.

그리고 자신이 실제 사용될 로그 라이브러리에 대한하는 jar파일을 추가한다. 예를 들어 JDK의 log를 이용하고 싶다면 아래와 같이 CLASSPATH를 설정한다.

set CLASSPATH = %CLASSPATH%;slf4j-api-1.4.3.jar;slf4j-jdk14-1.4.3.jar

또는 log4j의 log를 이용하고 싶다면 아래와 같이 CLASSPATH를 설정한다.

set CLASSPATH = %CLASSPATH%;slf4j-api-1.4.3.jar;slf4j-log4j12-1.4.3.jar

일단 그냥 log 객체만 만들어 두고 나중에 사용하고 싶다면 아무 작업도 하지 않은 slf4j-nop-1.4.3.jar 파일을 넣으면 된다.

set CLASSPATH = %CLASSPATH%;slf4j-api-1.4.3.jar;slf4j-nop-1.4.3.jar

혹시 여러 log library를 같이 사용하고 싶다고 엉뚱한 생각을 하시는 분들이 다음과 같이 할 수 있다.

set CLASSPATH = %CLASSPATH%;slf4j-api-1.4.3.jar;slf4j-jdk14-1.4.3.jar;slf4j-log4j12-1.4.3.jar

위와 같이 할 경우 JDK의 log 기능만 사용하게 된다. 즉 CLASSPATH 경로상 먼저오는 jar파일인
slf4j-jdk14-1.4.3.jar를 사용하며 나중에 오는 동일 API를 가지는 파일은 무시하게 된다.

Note: slf4j는 간단한 api 매핑 정도의 기능만 있기에 각 log library를 사용하기 위해서 각 log library를 필요시 다운받아서 설치해야되며 환경설정도 따로 필요하다.

이상으로 간단한 강좌를 마친다.[끝]

덧글---

다시 생각하는게 이 slf4j를 사용해야 될까하는 이유이다. slf4j가 아무 이유없이 나오지는 않았을 것이다.
즉, 요즘 log4j가 대세이고 모든 곳에서 사용하고 있다고 하지만 100%는 아니다.

log4j를 사용하지 않는 사람도 있을 것이다. 몰라서 일 수도 있고 자신이 원하는 기능이 없어서 일수도 있다.

각각의 장단점을 잘 알고 자신이 선택하는게 중요하겠다.

전에 읽었던 글인데.. 잠시 참고삼아 한번 읽어 보기 바란다.

http://lastmind.net/blog/2006/04/slf4j.html

위의 글을 읽으면서 다시 생각하게 되었다.

표준이라는게 모든 것을 빠르게 흡수하면서 변하기는 힘들다. logging 기능에서도 여러 가지 라이브러리나 프레임워크가 나오는 것도 사용자의 다양한 요구들이 나오기 때문이다.

단순하게 log4j를 사용해도 상관은 없다. 그게 자신이 내린 합당한 선택이기 때문이다. 너무 많은 툴과 도구 들이 나옴으로서 선택에 어려움이 커지는 것은 당연한다. 하나의 표준으로 지정해서 그걸 사용하고 이를 바탕으로 확장된 개념이 나온다면 더 좋을 것이다.

그것에 대한 선택과 책임은 자신이므로 신중하게 선택해서 결정하면 된다. 잘 모르고 처음이면 log4j가 좋을 수도 있다.

History

2009.12.01 ospace 예제 코드 출력 양식 변경

반응형