본문 바로가기
Spring

[Spring] Slf4j + Log4j2 로거 적용하기

by 케로베로 2021. 3. 29.

 현재 진행중인 프로젝트 Shoe-Auction은 Lombok이 제공해주는 Slf4j와 스프링 부트의 기본 로거인 Logback을 이용해 간단한 설정으로 로깅을 진행중이었다. 사실 설정이라고 할 것도 없었다고 생각한다.

 

 그러다 자바 성능 튜닝 이야기라는 책을 읽게 되었고 로그와 관련된 10장 부분 내용을 읽고 지금까지 로그에 대해 너무 무심하지 않았나 반성이 들어서 로그에 대해 알아보았다. 알아보는 중 각 로거들의 성능 벤치마킹 그래프를 보게 되었는데, Logback을 뛰어넘는 Log4j2의 성능을 보고 그 이유가 궁금해졌다. 

 

(사진: https://logging.apache.org/log4j/2.x/performance.html)


🤔 Log4j2는 무엇이 다를까?

 Logback 또한 현재 많은 스프링 프로젝트에서 사용되고 있으며, 기존의 Log4j에 비하여 빠르고 메모리 효율도 좋다고 알고있었다. 그렇다면 Log4j2는 Logback과 무슨 차이점 때문에 더 나은 성능을 보여주는 것일까?

 

 그 이유는 아파치 도큐먼트에서 찾을 수가 있었다.

Log4j 2에는 LMAX Disruptor 라이브러리를 기반으로하는 차세대 비동기 로거가 포함되어 있습니다. 다중 스레드 시나리오에서 비동기 로거는 Log4j 1.x 및 Logback보다 18 배 더 높은 처리량과 몇 배 더 낮은 지연 시간을 제공합니다. Log4j 2는 특히 다중 스레드 응용 프로그램에서 Log4j 1.x, Logback 및 java.util.logging을 훨씬 능가합니다.

 

 log4j2는 강력한 성능의 비동기 방식 로깅을 제공해주기 때문에 기존의 로거에 비해 더 나은 성능을 보여주며, 스레드의 수가 증가할 수록 더 큰 차이를 보여준다.

 

 logback과 비교 후 진행중인 프로젝트에 사용하던 Logback을 Slf4j로 변경하기로 결정했다.

 

❗ Log4j2 적용하기

 로거를 감싸는 Slf4j 로깅 퍼사드가 있어서 로거를 변경하는 것은 어렵지 않으며, 설정 이외의 코드의 변경은 필요하지 않았다.

 

 Slf4j의 설정을 위한 파일은 xml, yml, json 등을 이용하여 만들 수 있다. 본 프로젝트에서는 익숙하게 사용했던 yml을 사용해서 설정하겠다.

 

 우선 build.gradle에 Log4j2와 로깅 설정을 위한 jackson-data-format-yml 의존성을 추가해야한다.

    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    implementation group: 'com.fasterxml.jackson.dataformat', name: 'jackson-dataformat-yaml'

 

 또한  Log4j2 의존성에 포함되어 있는 spirng-boot-starter-web 내에 있는 spring-boot-starter-logging을 exclude 해주어야 한다. 이미 spring-boot-starter-log4j2 의존성에 포함되어 있기 때문이다.

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

 

 아직 로컬 환경에서 개발중이며 로그는 오직 콘솔에만 찍고 있는 현재 프로젝트 상황에서는 장황한 설정이 필요하지 않으므로 application.yml에 간단한 설정으로만 처리하고 있다.

logging:
  level:
    root: debug
  pattern:
    console: "[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

 

 하지만 필요한 로깅 관련 설정이 점점 늘어난다면 클래스 패스에 log4j2.yml 설정 파일을 만들어 분리해주는 것이 좋다. 아래의 설정은 콘솔과 파일에 로그를 출력하는 샘플 설정이며 Appender는 로그를 출력할 위치를, Logger는 로그를 출력하는 주체를 의미한다.

 

 

 

💻 참조

logging.apache.org/log4j/2.x/manual/configuration.html

 

Log4j – Configuring Log4j 2

Configuration Inserting log requests into the application code requires a fair amount of planning and effort. Observation shows that approximately 4 percent of code is dedicated to logging. Consequently, even moderately sized applications will have thousan

logging.apache.org