[SpringBoot] Logback 적용하기
SpringBoot 애플리케이션을 개발하다 보면 로그 관리의 중요성이 점점 커지게 됩니다. 단순히 `System.out.println` 으로 출력하는 수준을 넘어서 로그 레벨별 관리, 로그 파일 분리, 로그 백업 및 외부 시스템 연동 등이 필요해집니다.
이번 포스팅에서는 로그를 더욱 세밀하게 관리하기 위한 SpringBoot의 기본 로깅 라이브러리인 Logback이 무엇인지, 어떻게 설정할 수 있는지에 대해 알아보도록 하겠습니다.
1. 로깅(Logging)이란?
`로깅(Logging)`은 애플리케이션이 동작하는 동안 발생하는 다양한 사건(event)이나 상태 정보를 기록하는 것을 의미합니다. 개발자나 운영자가 프로그램의 동작을 이해하고, 문제를 진단하며, 성능을 개선하는 데 중요한 역할을 합니다.
Logging이 필요한 이유
- `디버깅` 예상치 못한 오류나 버그 발생 시 원인 파악에 도움
- `모니터링` 서비스가 정상적으로 작동하고 있는지 확인
- `추적` 특정 요청이나 트랜잭션의 흐름을 따라가며 문제점 파악
- `보안` 접근 로그, 에러 로그 등을 통해 보안 위협 감지
Logging과 `System.out.println, println 등`의 차이
초기 단계에서는 단순히 `System.out.println(), println() 등`으로 로그를 출력하는 경우가 많습니다. 하지만 이러한 방식은 다음과 같은 한계가 있습니다.
- 로그 레벨별 구분 불가능 (INFO, ERROR 등)
- 파일 저장 및 관리 어려움
- 운영 환경에서 성능 저하 및 관리 문제 발생
특히, System.out.println()은 `표준 출력 스트림(System.out)`을 사용하며, 이는 기본적으로 동기적 I/O 방식입니다. 따라서 로그를 남길 때마다 메인 스레드가 I/O 작업이 끝날 때까지 대기해야 하므로 애플리케이션 처리 속도에 영향을 줄 수 있습니다. 대량의 로그가 쏟아질 경우 병목 현상이 발생하여 전체 성능이 떨어질 수 있습니다.
2. Logback이란?
Logback은 JVM 기반 애플리케이션을 위한 로깅 프레임워크로, SLF4J의 네이티브 구현체입니다. Java 뿐만 아니라 Kotlin, Scala, Groovy 등 JVM에서 실행되는 모든 언어에서 사용할 수 있습니다.
Log4j의 후속작으로 개발되었으며, 더 나은 성능과 다양한 기능을 제공합니다.
2-1. SLF4J와 Logback의 관계
많은 개발자들이 Lombok의 `@Slf4j` 어노테이션이나 `LoggerFactory`를 사용해서 로그를 기록하는데, 이들과 Logback의 관계에 대해서 정확히 이해하는 것이 중요합니다.
- SLF4J `Simple Logging Facade for Java`
- 로깅을 위한 `인터페이스(API)`를 제공
- `@Slf4j, LoggerFactory 등`을 통해 개발자가 코드에서 로그를 쉽게 기록
- 실제 로깅 구현체와 애플리케이션 코드를 분리하는 추상화 계층 역할
- Logback
- SLF4J 인터페이스의 `구현체`
- SLF4J를 통해 들어온 `로그 메세지를 실제로 처리`
- 로그를 콘솔에서 출력할지, 파일에 저장할지, 어떤 형식으로 출력할지 등을 결정
- 로그 레벨 관리, 파일 롤링, 압축, 필터링 등 세밀한 로그 관리 담당
즉, 개발자는 `SLF4J로 로그를 기록`하고, `Logback이 그 로그를 어떻게 처리할지`담당하는 구조입니다.
2-2. Logback의 주요 특징
- `고성능` Log4j보다 약 10배 빠른 성능
- `자동 리로딩` 설정 파일 변경 시 자동으로 재로딩
- `압축 및 파일 삭제` 오래된 로그 파일 자동 압축 및 삭제
- `조건부 처리` 설정에서 조건부 로직 사용 가능
- `로그 레벨 지원` 다양한 로그 레벨을 통한 세밀한 로그 관리
로그 레벨(Log Level)
로그 레벨은 로그 메세지의 중요도와 심각도를 나타내는 등급입니다. Logback에서는 다음과 같은 로그 레벨을 제공합니다.
`중요도 순: ERROR → WARN → INFO → DEBUG → TRACE`
- `ERROR` 애플리케이션 오류가 발생했을 때 사용 (예외 발생, 시스템 장애)
- `WARN` 잠재적인 문제 상황이지만 애플리케이션은 계속 동작
- `INFO` 일반적인 실행 정보, 주요 비즈니스 로직의 시작/완료
- `DEBUG` 개발 및 디버깅 시 필요한 상세 정보
- `TRACE` 가장 상세한 정보, 코드 실행 흐름 추적
SpringBoot에서 기본 동작 `spring-boot-starter-web`에는 Logback이 내장되어 있기 때문에, 별도의 설정 없이도 `@Slf4j, LoggerFactory`를 사용해서 로그 레벨별 메세지를 기록할 수 있습니다. Logback이 이러한 로그 메세지들을 받아서 설정된 규칙에 따라 콘솔이나 파일에 출력하는 것입니다.
3. Logback 기본 설정
SpringBoot는 별도의 설정 없이도 `spring-boot-starter` 의존성에 이미 포함되어 있어, Logback을 기본 로깅 프레임워크로 사용합니다.
3-1. 기본 로그 레벨 설정
application `.yml 또는 .properties`에서 간단하게 로그 레벨을 설정할 수 있습니다.
# application.yml
logging:
level:
root: INFO # 전체 애플리케이션: INFO 레벨 이상 (INFO, WARN, ERROR) 출력
com.example.app: DEBUG # 특정 패키지: DEBUG 레벨 이상 (DEBUG, INFO, WARN, ERROR) 출력
org.springframework.web: DEBUG # Spring Web: DEBUG 레벨 이상 출력
# application.properties
logging.level.root=INFO
logging.level.com.example.app=DEBUG
logging.level.org.springframework.web=DEBUG
로그 레벨 출력 범위
위와같이 로그 레벨 설정하면 중요도 순으로 해당 로그 레벨까지 출력이 이루어집니다.
- `ERROR` ERROR만 출력
- `WARN` WARN, ERROR 출력
- `INFO` INFO, WARN, ERROR 출력 (SpringBoot 기본값)
- `DEBUG` DEGUB, INFO, WARN, ERROR 출력
- `TRACE` 모든 레벨 출력
3-2. Logback 기본 설정 파일 구조
더욱 세밀한 제어를 위해서는 `logback-spring.xml` 파일을 사용합니다.
logback.xml vs logback-spring.xml 차이
`logback.xml` 일반적인 Logback 설정 파일
`logback-spring.xml` SpringBoot 전용 설정 파일로, Spring Profile 기능과 Spring 환경변수 사용 가능

Logback 설정 파일은 `src/main/resources` 다렉토리에 추가합니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- Step 1: 콘솔 출력용 Appender 정의 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 로그 메시지 포맷 설정 -->
<encoder>
<!-- 날짜, 스레드명, 로그레벨, 로거명, 메시지 순서로 출력 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Step 2: 파일 출력용 Appender 정의 (롤링 기능 포함) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 기본 로그 파일 경로 -->
<file>logs/app.log</file>
<!-- 파일 롤링 정책: 시간과 크기 기반 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 롤링된 파일명 패턴: app.2025-09-12.1.log 형태 -->
<fileNamePattern>logs/application.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 크기 기반 롤링 트리거 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- 파일 하나당 최대 100MB -->
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 30일간 보관 -->
<maxHistory>30</maxHistory>
<!-- 전체 로그 파일 총 크기 제한: 3GB -->
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<!-- 파일용 로그 메시지 포맷 (콘솔과 동일) -->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Step 3: 루트 로거 설정 (전체 애플리케이션 기본 설정) -->
<root level="INFO">
<!-- 콘솔과 파일 두 곳에 모두 출력 -->
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
<!-- Step 4: 특정 패키지별 세부 로그 레벨 설정 -->
<!-- com.example.app 패키지는 DEBUG 레벨 이상 출력 -->
<logger name="com.example.app" level="DEBUG" />
<!-- Spring Web 관련 로그도 DEBUG 레벨로 출력 -->
<logger name="org.springframework.web" level="DEBUG" />
</configuration>
주요 구성 요소
- `<appender>` 로그를 어디에(콘솔/파일) 어떻게 출력할지 정의하며, 대표적인 구현체는 다음과 같습니다.
- `ConsoleAppender` 콘솔 출력
- `FileAppender` 지정한 파일에 저장
- `RollingFileAppender` 여러 파일을 순환하며 저장
- `SMTPAppender` 이메일 전송
- `DBAppender` 데이터베이스 저장
- `<encoder>` 로그 메세지의 출력 형식 정의
- `<rollingPolicy>` 로그 파일 분할 및 보관 정책
- `<root>` 전체 애플리케이션의 기본 로그 설정
- `<logger>` 특정 패키지나 클래스의 개별 로그 설정
3-3. 환경별 설정 분리
SpringBoot의 Profile 기능을 활용하여 환경별로 다른 로그 설정을 적용할 수 있습니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 개발 환경 설정 -->
<springProfile name="dev">
<!-- 로그 설정 -->
</springProfile>
<!-- 운영 환경 설정 -->
<springProfile name="prod">
<!-- 로그 설정 -->
</springProfile>
</configuration>
여기서 `<springProfile>`태그는 단순한 XML 조건문이 아닌, SpringBoot의 애플리케이션 프로필`spring.profiles.active` 값을 바라보고 동작합니다.
즉, application.yml 이나 실행 옵션에서 어떤 프로필이 활성화되었는지에 따라 Logback 설정이 자동으로 분기처리됩니다.
마무리
Logback은 SpringBoot에서 강력하고 유연한 로깅을 제공합니다. 적절한 설정을 통해 애플리케이션의 상태를 효과적으로 모니터링하고, 문제 상황에 빠르게 대응할 수 있습니다.
개발 초기에는 간단한 설정으로 시작하여, 애플리케이션이 성장하면서 점진적으로 더 정교한 로깅 전략을 구축해나가는 것이 중요하다고 생각됩니다. 특히 운영 환경에서는 로그 파일 관리, 성능 최적화, 보안 등을 종합적으로 고려한 설정이 필요합니다.
'Spring' 카테고리의 다른 글
| [SpringBoot] AWS S3 상품 이미지 등록과 고아객체 처리 구현 예제 (0) | 2025.05.06 |
|---|---|
| [SpringBoot] Spring Docs + Swagger 적용하여 API 문서 자동화하기 (0) | 2025.02.20 |
| [SpringBoot] Scale-out 환경에서 발생하는 Scheduler 중복 실행 문제 Shedlock으로 해결하기 (0) | 2025.02.06 |
| [SpringBoot] 트랜잭션 전파 속성 (Transaction propagation) (0) | 2025.02.02 |
| [SpringBoot] AWS S3 다중 이미지 파일 업로드 및 삭제 구현하기 (feat. MultipartFile) (2) | 2025.01.17 |