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


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 작업이 필요합니다.


ext {
    springBootVersion = '1.4.2.RELEASE'
    slf4jVersion = '1.7.21'
    log4j2Version = '2.5'
    commonsLogging = '1.2'
}

...

dependencies {

    // SpringBoot Web
    compile("org.springframework.boot:spring-boot-starter-web:${springBootVersion}") {
        exclude module: 'spring-boot-starter-logging'
    }


    // SpringBoot AOP
    compile("org.springframework.boot:spring-boot-starter-aop:${springBootVersion}") {
        exclude module: 'spring-boot-starter-logging'
    }

   ...

    // 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}")

   ...
}

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

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

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

References


Donations ❤

제가 작성한 글이 작게라도 도움이 되었기를 바랍니다.
관심 가져주시는 분이 있는 것을 느끼고 힘내기 위해 기부 버튼을 만들어봤습니다.
혹시 가능하시다면 $1 라도 기부 부탁드립니다 ^^





Associated Posts

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

  • 홈페이지 현황 ( Log4J 2 관련 대박사건 )


    Apache Logging Service Logo
    ( 이미지 출처 : https://logging.apache.org )

    Log4J 공식사이트- Articles and Tutorials에서 제 블로그 글을 링크 걸어두고 있던 것을 발견하여 기록합니다.

    큰 의미가 있는 것은 아니지만 개인적으로 기분이 좋네요. (저한테만 대박사건 ㅋ)


  • Log4j 2 설정하기


    Apache Logging Service Logo
    ( 이미지 출처 : https://logging.apache.org )

    Configuration 파일을 어디다가 둬야 혹은 어떻게 처리해야 Log4j 를 사용할 수 있을까요?
    저는 예전에는 이것 때문에 굉장히 애를 먹었습니다.

    분명 Spring을 쓸 때는 src/main/resources 아래에 두면 잘 돌아갔었습니다.
    근데 프레임워크가 없는 레거시 시스템에 적용하려고보니 당연히도 src/main/resources가 없죠.
    알고보니 WAS의 web.xml 에서 설정해야 하더군요.
    또 다른 프로젝트로 가서 적용하려다보니 Daemon으로 돌리는 시스템이라 WAS가 없고 web.xml이 없더군요.

    Log4j 를 접하면 저는 항상 당황스러움이 가장 먼저 떠오릅니다.

    그래서 가장 우선적으로 configuration을 적용하는 방법을 설명합니다.
    그리고 Log4j 2 에서 제공하는 강력한 성능의 비동기방식 로깅처리에 대해서 알아보겠습니다.
    Configuration 작성법은 샘플을 통해서 간략히 설명하겠습니다.



Disqus Social Community

SNS계정으로 댓글을 달아도 SNS에 글이 남지 않습니다.
이메일 주소 입력으로 글을 남길 수 있으며, 답변이 달리면 이메일로 알림을 받을 수 있습니다.

i