이상을 꿈꾸는 몽상가.. 프로그래밍을 좋아함..


SLF4J 와 Log4j 2 연동하기

Spring SLF4J Log4J2 샘플을 Github에 올려뒀습니다.
다만, 샘플은 이 글의 목적인 SLF4J-Log4J2 연동의 내용 외의 SpringBoot의 기본적인 설정이 포함되어있습니다.
참고하시기 바랍니다.

SLF4J (Simple Logging Facade for Java)

java.util.logging, Logback, Log4j와 같이 다양한 logging framework들이 있습니다.
그 각각의 framework들은 사용법이 제각각 입니다. 그 framework를 변경하면 Java 코드도 변경이 필요합니다.

SLF4J의 역할은 다양한 logging framework들의 facade(혹은 추상체) 역할을 합니다.
사용중인 logging framework를 변경해도 Java 코드에 대한 변경이 필요없어집니다.
만약 SLF4J를 사용하지 않는다면 모든 Java 코드의 logging 관련 내용을 수정해야하는 대형 작업이 필요하겠죠.

Gradle Configuration

5개의 dependency를 추가해주시면 됩니다.

만약에 Spring framework을 사용하신다면 Spring에 기본 내장된 라이브러리와 충돌이 납니다.
해당 라이브러리에 대한 exclude 작업이 필요합니다.


...(생략)

configurations {
    all {
        exclude  group: "org.springframework.boot", module : "spring-boot-starter-logging"
    }
}


dependencies {

    // SpringBoot Web
    compile 'org.springframework.boot:spring-boot-starter-web'

    // SLF4J-Log4j2
    compile("commons-logging:commons-logging:${commonsLogging}")
    compile("org.slf4j:slf4j-api:${slf4jVersion}")
    compile("org.apache.logging.log4j:log4j-api:${log4j2Version}")
    compile("org.apache.logging.log4j:log4j-core:${log4j2Version}")
    compile("org.apache.logging.log4j:log4j-slf4j-impl:${log4j2Version}")

   ...(생략)
}

Spring Boot Starter 활용

Spring Boot 를 사용 중이시라면 spring-boot-starter-log4j2 dependency를 이용해서 1개의 의존성 추가로도 해결됩니다.


configurations {
    all {
        exclude  group: "org.springframework.boot", module : "spring-boot-starter-logging"
    }
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'

    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

Log4j2 XML 설정

Log4j 2 설정하기 글을 참고하시기 바랍니다.

Java Code Sample

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

public class Practice {

    Logger logger = LoggerFactory.getLogger(getClass());

    public void hello(String name) {
        logger.info("Hello {}", name);
    }

}

hello method를 호출해보시면 log4j2.xml 설정에 따라 logging 되는 것을 볼 수 있으실 겁니다.
근데 위 Java 코드에는 SLF4J만 import 되어있고 Log4j2 관련 내용은 전혀 없습니다.
나중에 다른 logging framework으로 교체를 해야하더라도 Java 코드들을 수정할 필요가 전혀 없습니다.
gradle.build 에서 dependencies만 잡아주시면 됩니다.

SLF4J 의 제대로 된 사용법은 아래 링크를 참고하시기 바랍니다.

부수적인 이야기

우리는 다양한 프로그램들을 접목해서 하나의 시스템을 구성합니다.
쉽게 얘기해서 다양한 라이브러리, 프레임워크를 사용합니다.

만약에 필수적으로 사용해야하는 특정 라이브러리에서 버그가 있는 것 같다면 어떻게 해야할까요?
그 라이브러리의 디버그 로그를 보고 싶다면 어떻게 해야할까요?

만약에 사용되어지는 라이브러리, 프레임워크들이 SLF4J를 통해서 logging을 처리하고 있다면
시스템에서 사용하고 있는 logging framework로도 모든 라이브러리, 프레임워크들의 로그를 살펴볼 수도 있을 것입니다.
물론 너무 많은 로그가 남겨질테니 출력 대상 package를 설정이 필요합니다.

SLF4J를 사용하고 있지 않은 라이브러리라면 해당 라이브러리가 사용하는 logging framework를 따로 구성해줘야될 것입니다.

라이브러리를 배포하시는 분이나
오픈소스 프로그램을 만드시는 분들은
SLF4J를 사용해주시면 사용자들이 더 쉽게 더 깊게 사용할 수 있을 것입니다.

References


Associated Posts

관련된 주제를 살펴볼 수 있도록 동일한 Tag를 가진 글들을 모아뒀습니다. 제목을 눌러주세요.

i