자바 로깅

간만에 Java Programming을 다시 시작했는데 Spring3.0을 보니 로깅이 모두 slf4j로 바뀌어져 있다. 음.. 그렇다. 요즘은 slf4j를 사용한다. 그럼 어떤 장점이 있어서 slf4j가 대세가 되었을까. commons-logging으로 로그를 남길 때 보통 아래 처럼 하게 된다.

log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]" );
위 코드는 무엇이 문제일까?

로깅레벨 설정을 error로 켜두면 debug 코드는 안찍는다. 하지만 비록 로그에 남지 않는다고 하더라고 실행은 된다. String끼리 더하기 연산도 실행되고 abc() 함수도 호출한다. 즉, 쓸 때없이 자원을 낭비하는게 첫번째 문제이다. 그래서 다음과 같이 할 수 있다.
if (log.isDebugEnabled()) {
    log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ " + abc(id) + "]"  );
}
if(log.isDebugEnabled())를 집어 넣어서 로그 레벨이 debug가 아니라면 아예 건너뛰게 만들었다. log.isDebugEnabled()를 실행하는것도 리소스를 잡아 먹긴 하지만 부담이 큰 작업은 아니다. 하지만 이런식으로 하게 되면 코드가 지저분해진다. 게다가 로깅레벨이 여러단계일 때 if 문이 중첩될 수 있는 문제가 있다.

또 다른 문제는 로그 레벨이 debug로 설정되어 있을 때 발생한다. 로그 레벨이 debug일 때 
if (log.isDebugEnabled())는 무의미한 코드가 되어 버린다. 작지만 리소스 낭비다.

slf4j를 사용하면 아래처럼 바꿀 수 있다.
log.debug("리턴값을 로그로 남겨 봐야지~ 리턴값: [ {} ]", abc(id));

로그를 찍든 안찍든 String을 일단 더하고 보는 것과는 처리 방식이 다르다. {} 에는 abc(id)의 리턴값이 들어간다.

log4j를 만든 Ceki Gülcü(어떻게 읽는건가요?)라는 분이 log4j를 개선한 logback라는걸 또 만들었다.

사용하는 방법은 똑같다.


package chapters.introduction;

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

public class HelloWorld1 {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger("chapters.introduction.HelloWorld1");
        logger.debug("Hello world.");
    }
}



slf4j(Simple Logging Facade for Java)는 각종 로깅프레임워크를 추상화 시켜주는 기능을 한다. 만약 기존에 log4j를 사용하고 있었다면 log4j는 지우고 logback를 대신 넣으면 된다. 

설정 파일을 따로 만들지 않으면 BasicConfigurator을 사용하게 된다.

[참고]
http://logback.qos.ch/manual/configuration.html
http://logback.qos.ch/reasonsToSwitch.html


댓글

이 블로그의 인기 게시물

미적분과 차원

apache rewrite_module 로그