모눈종이에 사각사각
logback 적용하기 본문
제가 관리하고 있는 서비스에서 로그 설정이 제대로 되고 있지 않아 로그가 쌓이지 않고 있었습니다.
따라서 로깅 체계를 다시 도입하고자 했습니다.
그전에 로깅 체계를 도입하려고 할 때 항상 나오는 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 설정 파일을 불러오는 순서는 다음과 같습니다.
- logback-test.xml
- 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");
// 작업 수행 로직
}
}
'활동기록' 카테고리의 다른 글
글또를 마무리하며 (1) | 2025.03.28 |
---|---|
한글이 깨져요! 인코딩 문제 해결 과정(UTF-8 vs MS949) (0) | 2025.02.16 |
2024 회고 및 2025 다짐 (2) | 2025.02.02 |
HttpSessionListener 사용하기 (0) | 2025.01.19 |
JSP 페이지의 실행 순서와 컴파일 과정 이해하기 : JSP 오류 해결 (0) | 2024.12.22 |