웹상에 퍼져있는 slf4j 연동관련 정리

일반적으로 사용되는 Facade 로깅 라이브러리는 JCL(http://commons.apache.org/logging/), SLF4J(http://www.slf4j.org/)
두개인거 같다.

이 두개의 라이브러리 모두 실제 로깅처리는 log4j 같은 실제 구현라이브러리들에 처리를 맡기는 구조이다.

자 그럼 이 두개의 라이브러리 중에 어떤걸 주로 쓰느냐 하면 SLF4J 라이브러리 이다.

JCL은 실제 로그 구현체를 선택하는 시점이 런타임이라 다중 클레스로더(ClassLoader)를 사용하는 환경에서 문제가
될수 있고 런타임시점에 동작하기 때문에 성능상에 이슈 또한 있다고 한다.

더불어서 SLF4J는 로그 출력시 포멧팅을 지원하기 때문에 JCL을 사용할때의 아래와 같은 불편함을 해결해준다.
성능상 심하게는 30배정도 더 빠르다고 한다. 믿거나 말거나..-_-

EX) JCL
if( log.isDebugEnabled() ) {
   log.debug(name + "님 안녕하세요");
}

EX) SLF4J
logger.deubg("{}님 안녕하세요", name);

이 두개의 예들은 같은 결과를 만들지만 보다시피 JCL을 사용할때 로그레벨을 확인하는 IF문이 SLF4J에는 빠져있다.
또한 SLF4J는 해당로그 레벨에서만 인자로 주어진(name) 값을 적용하기 때문에 로그레벨을 더이상 걱정할 필요가 없

Log4j-slf4j연동

log4j가 설정되어있다는 기준으로 보았을때 slf4j 는 퍼사드 객체임을 명심해야 한다.

그자체로 로깅기능보다는

메이븐 설정

<dependency>
            <groupid>org.slf4j</groupid>
            <artifactid>slf4j-api</artifactid>
            <version>${org.slf4j.version}</version>
        </dependency>
        <dependency>
            <groupid>org.slf4j</groupid>
            <artifactid>jcl-over-slf4j</artifactid>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupid>org.slf4j</groupid>
            <artifactid>log4j-over-slf4j</artifactid>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>      
        <dependency>
            <groupid>org.slf4j</groupid>
            <artifactid>slf4j-log4j12</artifactid>
            <version>${org.slf4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
   <groupid>org.slf4j</groupid>
   <artifactid>slf4j-jcl</artifactid>
   <version>${org.slf4j.version}</version>
</dependency>

slf4j-log4j12-1.6.1.jar는 slf4j와 log4j의 바인딩 역활을 하고 log4j-1.2.16.jar는 log4j를 위한 jar이다.

log4j 설정파일인 log4j.properties나 log4j.xml을 사용할 경우 반드시 다운로드 받아야 된다.

샘플코드

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.PropertyConfigurator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class main
{

   public static void main(String[] args)
   {
Logger logger = LoggerFactory.getLogger(main.class);
PropertyConfigurator.configure("./lib/log4j.propertise");
// BasicConfigurator.configure();//log4j.xml을 안쓸 경우

logger.info("info1");
logger.info("info0");

logger.debug("dbg0");
logger.debug("dbg1");

logger.error("err0");
logger.error("err1");

   }

}

스프링 연동시

메이븐 설정

<dependency>
            <groupid>org.springframework</groupid>
            <artifactid>spring-context</artifactid>
            <version>${spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupid>commons-logging</groupid>
                    <artifactid>commons-logging</artifactid>
                </exclusion>
            </exclusions>
        </dependency>

....

<dependency>
            <groupid>log4j</groupid>
            <artifactid>log4j</artifactid>
            <version>1.2.15</version>
            <exclusions>
                <exclusion>
                    <groupid>javax.mail</groupid>
                    <artifactid>mail</artifactid>
                </exclusion>
                <exclusion>
                    <groupid>javax.jms</groupid>
                    <artifactid>jms</artifactid>
                </exclusion>
                <exclusion>
                    <groupid>com.sun.jdmk</groupid>
                    <artifactid>jmxtools</artifactid>
                </exclusion>
                <exclusion>
                    <groupid>com.sun.jmx</groupid>
                    <artifactid>jmxri</artifactid>
                </exclusion>
            </exclusions>
            <scope>runtime</scope>
        </dependency>

댓글

이 블로그의 인기 게시물

어쩌다 마주친 spring Error

nginx 설정정리

이클립스에서 톰캣 publish할때 에러