Logging - SLF4J

세정·2023년 12월 20일

SLF4J(Simple Logging Facade for Java)

로깅을 위한 퍼사드(프록시) 라이브러리
: 로깅 시스템에 대한 인터페이스를 제공하여 코드가 특정 로깅 라이브러리에 의존하지 않고 로깅을 수행할 수 있도록 도와준다.


System.out.println()을 두고 굳이 로깅을 사용하는 이유는?

로깅은 파일, 콘솔 등 출력을 유연하게 관리하고, 오류 디버깅 및 시스템 동작 추적에 도움을 주는 반면, System.out.println()은 간단한 출력용으로 사용되어 제어와 유연성 면에서 한계가 있다.
로깅은 더 많은 유연성, 제어력, 디버깅 및 관리 용이성을 제공하기에, 실제 애플리케이션 개발 및 운영에 적합하다.

특징로깅System.out.println()
출력 형식 지정 가능가능제한적
로그 레벨 및 필터링로그 레벨을 설정하여 관리레벨별로 로그 출력 x, 모든 출력을 일괄적으로 처리
로그 위치 설정파일, DB, 네트워크 등 위치 설정 가능콘솔에만 출력 가능
로그 성능로그 레벨에 따라 출력을 조절하여 성능 향상에 도움레벨 설정 및 성능 향상에 한계
유지보수 및 관리 용이성설정을 통해 동작 변경 및 관리 용이유연성 및 관리 용이에 한계

특징

  1. 추상화된 인터페이스
    : 로깅 시스템에 대한 추상화된 인터페이스를 제공하여, 코드가 특정 로깅 라이브러리에 의존하지 않고 로깅을 수행하게 되어 코드의 유연성이 높아진다.

  2. 다양한 로깅 백엔드 지원
    : Logback, Log4j, JUL(Java Util Logging) 등 다른 로깅 프레임워크를 유연하게 사용할 수 있다.

  3. 간편한 로깅
    : SLF4J-API를 활용하여 간단하고 명료한 방식으로 로깅 코드를 작성할 수 있다.

  4. 유연한 로깅 레벨 조정
    : SLF4J를 통해 로깅 레벨을 설정하여, 중요도에 따라 세밀한 조절이 가능하다.

  5. 메시지 형식화
    : 로그 메시지를 형식화할 수 있는 기능을 제공하여, 변수를 사용하거나 특정 형식으로 메시지를 출력할 수 있다.

  6. 유지보수 용이성
    : 코드에서 특정 라이브러리에 대한 직접적인 의존성이 줄어들어 로깅 라이브러리를 변경하거나 업그레이드하는 데 용이하다.


SLF4J의 핵심 구성 요소

Bridge

SLF4J와 다른 로깅 프레임워크 간의 연결

SLF4J가 자체적으로 로깅을 처리하지 않고,
다른 로깅 시스템으로의 연결(redirect)을 위한 다리 역할을 하는 Bridge를 제공한다.


SLF4J-API

로그 레벨출력 메서드설명
TRACEtrace()세분화된 정보 이벤트 지정
DEBUGdebug()애플리케이션을 디버그하는 데 가장 유용한 세분화된 정보 지정
INFOinfo()대략적인 수준에서 응용 프로그램의 진행 상황을 강조하는 정보 지정
WARNwarn()프로그램 실행에는 문제가 없지만, 잠재적으로 위험이 될 상황을 지정(경고성 메시지)
ERRORerror()어떠한 요청을 처리하는중 문제가 발생한 상태
FATALX응용 프로그램이 중단될 수 있는 매우 심각한 오류

사용 예

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class LogTest {
   private static final Logger logger = LogManager.getLogger(LogTest.class);

   public void LogTest() {

      //TRACE 레벨의 로그 기록
      logger.trace("TRACE 레벨의 로그입니다.");

      //DEBUG 레벨의 로그 기록
      logger.debug("DEBUG 레벨의 로그입니다.");

      //INFO 레벨의 로그 기록
      logger.info("INFO 레벨의 로그입니다.");

      //WARN 레벨의 로그 기록
      logger.warn("WARN 레벨의 로그입니다.");

      //ERROR 레벨의 로그 기록
      logger.error("ERROR 레벨의 로그입니다.");

      //FATAL 레벨의 로그 기록
      logger.fatal("FATAL 레벨의 로그입니다.");

   }
}

Binding

Bridge를 통해 SLF4J와 실제 로깅 시스템을 구현하는 구현체

SLF4J를 사용하여 로깅을 수행할 때, 실제 로깅 시스템으로의 연결을 위해 Binding이 필요하다.

SLF4J-API를 구현한 클래스에서 Binding으로 연결될 로깅 시스템에 로그 메시지를 전달하고 처리한다.

이 때, 하나의 API에 하나의 Binding을 두어야 한다.


동작 과정

  1. SLF4J-API를 사용하여 로그를 작성한다.
  2. Bridge는 SLF4J-API 호출을 받아, Binding된 로깅 시스템으로 메시지를 전달하는 중간 역할을 한다.
  3. Binding된 로깅 시스템은 Bridge를 통해 SLF4J-API로부터 전달받은 로그 메시지를 실제로 처리한다.

왜 SLF4J를 사용해야 할까?

로깅 시스템을 변경하거나 업그레이드할 때 발생할 수 있는 번거로움, 불필요한 동작을 줄일 수 있다.

즉, SLF4J를 사용함으로써 로깅 시스템에 대한 의존성을 낮추고, 애플리케이션의 로깅 코드를 로깅 시스템과 분리함으로써
나중에 로깅 시스템을 변경할 때 생기는 번거로움을 최소화할 수 있다.

그리고 다양한 로깅 시스템에서 SLF4J의 인터페이스를 구현한 Binding을 통해 쉽게 전환할 수 있다.


SLF4J와 Log4j의 차이

특징SLF4JLog4j
종류로깅 추상화 인터페이스로깅 시스템
역할로깅 시스템에 대한 추상화된 인터페이스 제공로그 기능 제공
주요 기능로깅 시스템 간의 일관된 인터페이스 제공다양한 로깅 기능 제공(로그 레벨, 출력 형식 등)
기능 확장성다양한 로깅 시스템과의 호환성, 유연한 기능 확장풍부한 기능 제공, 확장성 높음
보안 취약점보안 취약점 자체는 없지만, 로깅 시스템에 따라 보안 노출 가능성이 있음Log4j 2.x 버전에서 보안 취약점 발견
사용 방식로깅 시스템을 추상화하여 다른 시스템과의 호환성을 높임로깅 기능을 직접 제공 및 사용함




잘못된 정보가 있다면 댓글로 알려주세요!!

profile
하이

1개의 댓글

comment-user-thumbnail
2023년 12월 21일

잘 보고 갑니다 ^^

답글 달기