상세 컨텐츠

본문 제목

SLF4J 동작과정 개념정리

Spring/개념

by Chan.94 2024. 11. 21. 13:50

본문

반응형

Intro

SLF4J에 대해 정리하기 전에 Log4j, Logback, Log4j2를 간단하게 정리해 보자.

Log4j, Logback, Log4j2는 로깅 프레임워크라 한다.

  • Log4j
    • 아파치 재단에서 처음으로 개발한 자바 기반 로깅 유틸
      2015년 기준으로 개발이 중단되었으며 보완된 Log4j2가 나오면서 기존의 시스템이 아닌 이상 사용의 이유가 줄어들었다.
  • Logback
    • logback은 log4j 이후 나왔으며 향상된 기능으로 가장 널리 사용되고 있는 java 라이브러리
    • SpringBoot의 기본 log로 사용되고 있으며 spring-boot-starter-web안에 spring-boot-starter-logging의 logback이 기본적으로 포함되어 있어서 별다른 dependency 추가 없이 사용할 수 있다.
  • Log4j2
    • log4j2는 log4j를 보안한 라이브러리.
    • SptringBoot의 기본 log는 logback이기 때문에 log4j2 사용을 위해서는 spring-boot-starter-logging 모듈을 exclude 하고 spring-boot-starter-logging-log4j2 의존성을 주입해야 함.
    • Multi Thread 환경에서 비동기 로거(Async Logger)의 경우 다른 Logging Framework보다 많은 처리량과 짧은 대기 시간을 제공

      비동기 로거(Async Logger)
      Log4j2 새로 추가된 기능으로 로그 이벤트를 생성하는 스레드 로그 이벤트를 처리하는 스레드를 분리하여 로깅 시스템의 성능을 향상하는 로깅 방법을 의미

      로그 이벤트를 생성하는 스레드는 애플리케이션에서 수행되는 스레드로 로그 이벤트에 필요한 모든 정보를 캡처하기 위해 최소한의 작업만으로 이벤트를 생성한다.

      로그 이벤트를 처리하는 스레드는 고성능 큐에서 관리되며 로그 이벤트는 큐에 추가되고 별도의 스레드가 큐에서 이벤트를 꺼내서 로깅 처리를 한다. 이러한 처리방식을 나눔으로써 로그 이벤트를 추가하는 데 걸리는 시간만 대기하면 되고 처리가 되는 큐에서는 비동기식으로 처리가 되기에 상대적으로 동기식 로깅에 비해 빠르게 수행된다.

      단, 비동기 로거를 사용할 경우 버퍼에 로그를 우선 저장하기 때문에 Flush 되지 않은 로그는 유실될 수 있다는 단점이 있다.

SLF4J

SLF4J(Simple Logging Facade for Java)는 java.util.logging, logback 및 log4j2와 같은 다양한 로깅 프레임워크에 대한 인터페이스 역할을 하는 라이브러리다.

 

중요한 키워드는 Facade와 Interface 두 개다.
Facade Pattern이란 복잡한 시스템이나 서브시스템의 인터페이스에 대한 간략한 인터페이스를 제공하여, 시스템의 복잡성을 감소시키는 패턴을 뜻한다.

자세한 내용은 아래 포스팅을 참고하기 바란다.

퍼사드(Facade) 패턴

 

굳이 SLF4J라는 라이브러리를 사용하는 이유는 무엇일까?

log4j를 사용 중이었는데 logback으로 변경해야 하는 경우가 생기면 log4j를 사용한 전체 코드를 수정해야 할 것이다. SLF4J를 사용하면 전체 코드를 수정하지 않고 로깅 프레임워크만 변경해 주면 된다.

 

우리는 lombok의 @Slf4j 어노테이션을 추가하여 사용하고 있을 것이다.

 

SpringBoot 기본 로깅 프레임워크

SpringBoot는 기본 log로 logback을 사용하고 있어 spring-boot-starter-web안에 spring-boot-starter-logging라이브러리가 logback관련 라이브러리를 포함하고 있어 별다른 dependency추가 없이 사용할 수 있다.

 

spring-boot-starter-logging라이브러리에 logback-classic, logback-core, slf4j-api, log4j-to-slf4j, jul-to-slf4j 파일이 포함된 것을 확인할 수 있다. 아래 SLF4J의 동작과정을 정리하면서 해당 라이브러리들이 어떤 기능을 하는지 확인해 보자.


SLF4J 동작과정


Bridge

  • Bridge 모듈은 SLF4J를 제외한 다른 로깅 API(Log4J, JUL, JCL)의 Logger 호출을 SLF4J 인터페이스로 연결하여 SLF4J API가 대신 처리할 수 있도록 하는 어댑터 역할을 하는 라이브러리
  • Bridge 모듈을 제공하는 이유는 이전 레거시 로깅 프레임워크를 지원하여 SLF4J 인터페이스를 구현한 Logback과 같은 성능이 더 좋은 로깅 프레임워크로 실행하기 위해서
  • Bridge와 Binding에 같은 종류의 프레임워크를 사용하면 무한루프가 발생한다.

SLF4J API

  • 로깅 기능에 역할을 수행하는 추상 메서드를 제공한다.
  • SLF4J 라이브러리만 단독으로 사용할 수없고 구현체인 로깅 프레임워크가 있어야 한다.

Binding

  • SLF4J 인터페이스를 로깅 구현체(Logging Framework)와 연결하는 어댑터 역할을 수행하는 라이브러리
  • Bridge와 Binding에 같은 종류의 프레임워크를 사용하면 무한루프가 발생한다.

Bridge Bingding  
jcl-over-slf4j.jar slf4j-jcl-{version}.jar 무한루프
log4j-over-slf4j.jar slf4j-log4j12-{version}.jar 무한루프
jul-to-slf4j.jar slf4j-jdk14-{version}.jar 무한루프

 


마무리

흔히 무의식 중에 로그를 잘못 사용하는 경우가 있다. 그것에 대해 간단히 알아보자.

 

올바른 로그 사용법

로그를 출력할 때 + 연산을 사용하지 않는다.

log.debug("data : " + data);  // 올바르지 않은 사용법

로그 출력 레벨을 info로 설정하여 출력되지 않더라고 + 연산은 수행된다. 의도치 않게 불필요한 연산 작업을 수행시키는 꼴이다.

log.debug("data : {}", data);  // 올바른 사용법

의미 없는 연산이 발생하지 않는다. 더 효율적으로 리소스를 사용할 수 있다.

 

사용 중인 로거 확인방법

log.info("Logger : {}", log.getClass());

//Logback
//Logger : ch.qos.logback.classic.Logger

//Log4j
//Logger : org.apache.logging.slf4j.Log4jLogger
반응형

관련글 더보기

댓글 영역

>