Spring/Spring Boot

@Log4j2 vs @Slf4j with log4j2

TheWing 2021. 1. 22. 14:36

@Log4j2 vs @Slf4j with log4j2

  • 프로젝트 진행 도중 @Log4j2 을 사용할지 @Slf4j로 log4j2.xml 을 설정해서 같이 사용할지 고민을 했었다.

SLF4j(Simple Logging Facade For Java)

  • 애플리케이션이 문자열을 기록하도록한다. Log4j2 API는 텍스트를 로깅하려는 경우 모든 CharSequence 로깅을 지원하지만 모든 개체를 있는 그대로 로깅하는 것도 지원한다

Log4j2

  • 메시지 개체 로깅, Java 8 람다식 및 가비지 없는 로깅을 지원한다(CharSequence 개체 로깅시 문자열 생성방지)

뭘 써야할까?

  • Log4j2와 slf4j는 똑같은 기능을 제공한다고 한다.
  • Log4j2가 API와 구현 모듈로 분리되어서 SLF4J를 사용하지 않아도 된다고 한다.
  • 이전까지 10년 동안 애플리케이션에서 유연성을 구축하려면 SFL4J와 같은 래퍼 API를 사용해야했는데 이제는 무료로 제공이 되지 않는다. 이 접근 방식의 단점은 애플리케이션이 기본 로깅 라이브러리의 더 풍부한 기능 세트를 할 수 없다.
  • Log4j2는 애플리케이션이 최소 공통 분모로 제한 될 필요가 없는 솔루션을 제공한다

The escape valve: log4j-to-slf4j

  • Log4j2에는 log4j-to-slf4j브리지 모듈이 포함되어있다. Log4j2 API에 대해 코딩된 모든 애플리케이션은 언제든지 지원 구현을 slf4j 호환 구현으로 전환하도록 선택할 수 있다.

  • Log4j2 를 사용하면 더 많은 기능을 직접 제공하고 sfl4j와 같은 래퍼 API를 사용하는 것에 비해 비 기능적 이점이 있다.

장점

  • 메시지 API
  • 지연 로깅을 위한 Lambda
  • 문자열 대신 모든 개체 기록
  • Garbage Free
    • 가능한 경우 varargs를 생성하거나 문자열을 생성하지 마라
  • CloseableThreadContext는 항목 사용이 끝나면 MDC에서 항목을 자동으로 제거한다
  • 애플리케이션은 기본 Log4j2 코어 구현에 고정되지 않고도 Log4j2 API의 이러한 풍부한 기능을 안전하게 사용이 가능하다

애플리케이션이 더 이상 SLF4J API에 의해 의존하여 코딩해야한다는 의미는 아니다

Log4j2와 SLF4j 사이에는 차이가 없다

두 API 모두 네이티브 구현을 사용하는 경우 2개의 종속성이 필요하고 네이티브가 아닌 구현의 경우 4개의 종속성이 필요하다 SLF4J와 Log4j2 API는 이 점에서 동일하다

 

Reference

'Spring > Spring Boot' 카테고리의 다른 글

Spring Boot AutoConfiguration 자동 설정, 원리  (0) 2021.01.03