모눈종이에 사각사각

logback 적용하기 본문

활동기록

logback 적용하기

모눈종이씨 2025. 3. 16. 15:35

제가 관리하고 있는 서비스에서 로그 설정이 제대로 되고 있지 않아 로그가 쌓이지 않고 있었습니다.

 

따라서 로깅 체계를 다시 도입하고자 했습니다.

그전에 로깅 체계를 도입하려고 할 때 항상 나오는 SLF4J, Log4j, Logback이 각각 무엇인지 알아봅시다.

SLF4J, Log4j, Logback

SLF4J, Log4j, Logback은 자바 애플리케이션에서 로깅을 처리하는 데 사용되는 라이브러리들입니다.

SLF4J (Simple Logging Facade for Java)

  • 로깅에 대한 추상화 인터페이스 역할을 하는 라이브러리
  • 실제 로깅 구현체(Logback, Log4j 등)와 애플리케이션 코드 사이의 추상화 계층을 제공
  • 특정 로깅 구현체(Logback, Log4j 등)에 종속되지 않고 유연하게 변경 가능

Log4j (Apache Log4j)

  • Apache에서 만든 로깅 라이브러리 (초창기부터 사용됨)
  • 로깅을 담당하는 실제 구현체

Logback

  • Log4j의 후속 로깅 라이브러리
  • SLF4J의 공식 구현체(즉, SLF4J를 사용하면 기본적으로 Logback과 연결 가능)
  • Log4j보다 성능이 뛰어나고 메모리 효율성이 좋음

가지고 있는 라이브러리는 다음과 같습니다.

log4j-1.2.14.jar
slf4j-log4j12-1.6.6.jar
slf4j-api-1.7.7.jar
logback-classic-1.1.3.jar
logback-core-1.1.3.jar

만약 위의 라이브러리를 모두 사용한다면 다음과 같은 에러에 마주합니다.

 

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/path/to/your/application/lib/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/path/to/your/application/lib/log4j-slf4j-impl-2.14.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

 

그 이유는 구현체 라이브러리가 중복되어 있기 때문입니다.

따라서 한 개의 라이브러리를 선택해야 합니다.

 

라이브러리 선택

 

(출처 : [10분 테코톡] ☂️ 검프의 Logging(로깅) #1)

 

1. Log4j 사용할 경우

log4j-1.2.14.jar
slf4j-log4j12-1.6.6.jar
slf4j-api-1.7.7.jar

 

2. Logback 사용할 경우

slf4j-api-1.7.7.jar
logback-classic-1.1.3.jar
logback-core-1.1.3.jar

 

  • logback-core: 핵심 기능을 제공하는 모듈.
  • logback-classic: SLF4J와의 통합을 제공하는 모듈.

저는 logback 라이브러리가 SLF4J의 공식 구현체이기도 하기 때문에 logback 라이브러리로 선택했습니다.

logback 설정 파일

Spring Framework 애플리케이션에서 Logback 설정 파일을 불러오는 순서는 다음과 같습니다.

  1. logback-test.xml
  2. logback.xml

참고로 이 파일들은 classpath 하위에 위치해 있어야 하며, 그렇지 않은 경우 따로 설정을 해주어야 합니다. 그러나 번거로우므로 특별한 경우가 아니면 classpath 하위에 넣는 게 좋을 것 같습니다.

<configuration>

    <!-- 로그 파일이 저장될 디렉토리 경로 설정 -->
    <property name="LOG_DIR" value="./log" />

    <!-- 파일 Appender 설정 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 현재 로그 파일 경로 설정 -->
        <file>${LOG_DIR}/application.log</file>
        
        <!-- 롤링 정책 설정 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!-- 롤링된 파일 이름 형식 설정 -->
            <fileNamePattern>${LOG_DIR}/application.log.%i</fileNamePattern>
            <!-- 최대 파일 개수 설정 -->
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>

        <!-- 크기 기반 트리거 정책 설정 -->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 최대 파일 크기 설정 -->
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        
        <!-- 로그 메시지 형식 설정 -->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <logger name="com.lotte" level="debug" additivity="false">
				<appender-ref ref="FILE" />
    </logger>

    <!-- 루트 로거 설정 -->
    <root level="error">
        <appender-ref ref="FILE" />
    </root>
</configuration>

 

루트 로거를 debug로 했더니 너무 많은 로그들이 남아서 루트 로거를 error로 설정하고

클래스의 가장 상위 패키지를 따로 debug 레벨로 설정했습니다.

logback을 도입하는 이 서비스의 경우에는 기능이 별로 없는 서비스 이기 때문에 이렇게 설정했지만,

기능이 많은 서비스 같은 경우는 패키지별로 더 세세히 나눠서 관리하는 것이 좋을 것입니다.

스프링 설정

Spring 애플리케이션에서는 별도의 추가 설정 없이 SLF4J와 Logback을 사용할 수 있습니다. Spring은 SLF4J를 기본 로깅 API로 사용하기 때문입니다.

사용 방법

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyApp {
    private static final Logger logger = LoggerFactory.getLogger(MyApp.class);

    public static void main(String[] args) {
        logger.info("Application started");
        logger.debug("This is a debug message");
        logger.error("This is an error message");

        // 비즈니스 로직 추가
        performTask();
    }

    private static void performTask() {
        logger.info("Performing a task");
        // 작업 수행 로직
    }
}