본문 바로가기
Spring

Log4j에서 SLF4J + Logback 으로 전환하기

by 아토로 2022. 2. 3.

레거시에서 아직 사용 중인 Log4j를 SLF4J + Logback로 전환하려고 분석한 내용을 정리해본다.

로깅 퍼사드란

  • 로거 API를 추상화한 인터페이스이다.
  • 로깅에 관련된 여러 라이브러리에 대한 통일된 사용방식(API)을 제공하므로 로깅 라이브러리의 변경이 용이하다.

로깅 퍼사드: JCL, SLF4J
로거: JUL, Log4j, Log4j 2, Logback

퍼사드 패턴: 건물의 정면"을 의미하는 단어로, 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴

SLF4J 사용 이유

  • JCL은 런타임에 로거를 바인딩한다. 로거의 동적 바인딩으로 비효율 발생한다.
  • SLF4J은 컴파일 타임에 로거를 바인딩하므로 JCL에 비해 더 효율적이다.

적용 방법

pom.xml에 의존성 추가

<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.2.10</version>
</dependency>
<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>jcl-over-slf4j</artifactId>
   <version>1.7.35</version>
</dependency>
<!-- logback.xml 경로 변경 필요시 추가 -->
<dependency>
   <groupId>org.logback-extensions</groupId>
   <artifactId>logback-ext-spring</artifactId>
   <version>0.1.5</version>
</dependency>
  • logback-classic
    • Logback 모듈이며, logback-core와 SLF4J API 의존성을 포함하고 있다.
  • jcl-over-slf4j
    • JCL을 SLF4J로 연결해주는 브리지 역할을 한다.
    • 기존 코드를 유지하면서 SLF4J를 사용하고 싶다면 추가해야 한다.
    • // 기존 사용 코드
      private static final org.apache.commons.logging.Log logger = org.apache.commons.logging.LogFactory.getLog(LogExample.class);
  • logback-ext-spring
    • 기본적으로 main/java/resources/logback.xml 파일을 찾는다.
    • logback.xml 파일의 경로를 변경하려면 의존성을 추가하고, web.xml에 설정을 추가해야 한다.
    • <context-param>
        <param-name>logbackConfigLocation</param-name>
        <param-value>/WEB-INF/logback.xml</param-value>
      </context-param>
      <listener>
        <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
      </listener>

logback.xml 추가

  • 기본 참조 경로: main/java/resources/logback.xml
  • log4j.properties를 logback.xml로 변환할 수 있다.

SLF4J를 통한 로거 사용

private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
  • Lombok을 사용한다면 @Slf4j 애노테이션을 적용하여 변수 선언 없이 사용이 가능하다.

댓글