로깅(Logging)란?
애플리케이션이 동작하는 동안 시스템의 상태나 동작 정보를 시간순으로 기록하는 것을 말합니다.
주로 비기능 요구사항에 해당하며, 문제 추적, 성능 모니터링, 보안 분석 등 다양한 목적으로 사용됩니다.
Logback이란?
Logback은 자바 진영에서 가장 널리 쓰이는 로깅 프레임워크 중 하나입니다.
SLF4J(Simple Logging Facade for Java)를 기반으로 구현되었으며, 이전 세대인 Log4j보다 성능과 유연성이 뛰어납니다.
Logback의 특징
- 5가지 로그 레벨 지원
- ERROR : 심각한 오류로 인해 애플리케이션 동작이 불가능한 상태
- WARN : 잠재적으로 문제를 일으킬 수 있는 경고 상황
- INFO : 서비스의 주요 동작이나 상태 변경 기록
- DEBUG : 개발·디버깅 과정에서 필요한 상세 정보
- TRACE : DEBUG보다 더 세밀한 정보
- 환경별 다른 로그 레벨 설정 가능
(예: 개발 환경은 DEBUG, 운영 환경은 INFO) - 설정 파일 자동 감지
일정 주기마다 설정 파일을 스캔하므로 재시작 없이 변경 적용 가능 - 로그 파일 압축 및 보관 주기 설정 가능
- maxHistory로 보관 기간 관리 가능
간단한 주기 삭제는 maxHistory 속성으로 충분하며,
복잡한 백업·압축·외부 전송 후 삭제 같은 특수 상황은 스프링 스케줄러나 배치 작업으로 처리
Logback 설정 방법
Logback은 클래스패스(classpath)에 있는 설정 파일을 자동으로 읽어옵니다.
- 일반 자바·스프링 프로젝트 → logback.xml
- 스프링 부트 → logback-spring.xml (환경별 설정 프로필 지원)
의존성 설정
implementation 'org.springframework.boot:spring-boot-starter-logging'
설정 파일의 주요 구성 영역
1. Property 영역
- 경로나 패턴 등 재사용할 값을 정의
2. Appender 영역 (중요)
- 로그 출력 방식과 저장 위치를 정의
- Appender는 인터페이스이며, 대표 구현체:
- ConsoleAppender : 콘솔에 출력
- FileAppender : 지정한 파일에 저장
- RollingFileAppender : 여러 파일을 순환하며 저장 (파일 용량·날짜 기준 롤링 가능)
- SMTPAppender : 이메일로 로그 전송
- DBAppender : 데이터베이스에 로그 저장
3. Encoder 영역
- 로그의 출력 형식을 정의
- 패턴 예시:
| 패턴 | 의미 | 패턴 | 의미 |
| %d{yyyy-MM-dd HH:mm:ss.SSS} | 로그 시간 | %thread | 현재 쓰레드명 |
| %-5level | 로그 레벨 | %logger{36} | 로거 이름(길이 제한 가능) |
| %msg | 로그 메시지 | %n | 줄바꿈 |
| %C | 클래스명 | %L | 호출 라인 수 |
| %M | 메서드명 | %r | 애플리케이션 실행 후 경과 시간(ms) |
4. Root 영역(중요)
- 전역 기본 로깅 설정
- 모든 패키지/클래스에 적용 (별도의 logger 설정이 없을 때 기본값으로 사용)
- 예:→ 아무 로거 이름도 지정하지 않은 경우, INFO 이상만 출력
<root level="INFO">
<appender-ref ref="CONSOLE"/>
</root>
5. Logger 영역
- 특정 패키지·클래스에만 적용되는 로깅 설정
- Root 영역보다 우선순위가 높음
- additivity="false"로 하면 해당 로거의 로그가 Root로 전파되지 않음
- 예:→ com.example.api 패키지는 DEBUG까지 출력, 그 외는 Root 설정(INFO) 사용
<logger name="com.example.api" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
logback-spring.xml 예제
아래 예제는 개발 환경에서는 DEBUG 레벨까지 콘솔에 출력하고,
운영 환경에서는 INFO 이상 로그만 파일로 저장하며 30일 보관 후 자동 삭제하는 설정입니다.
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds">
<!-- 1. 공통 경로 및 패턴 설정 -->
<property name="LOG_PATH" value="./logs"/>
<property name="LOG_FILE_NAME" value="app-log"/>
<property name="LOG_PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
<!-- 2. 콘솔 출력 Appender -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 3. RollingFileAppender (일자별 로그 파일 분리 + 30일 보관) -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_PATH}/${LOG_FILE_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 파일명 형식: app-log.2025-08-09.log -->
<fileNamePattern>${LOG_PATH}/${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory> <!-- 30일 보관 -->
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 4. 환경별 로그 설정 -->
<!-- 개발 환경 -->
<springProfile name="dev">
<root level="DEBUG">
<appender-ref ref="CONSOLE"/>
</root>
</springProfile>
<!-- 운영 환경 -->
<springProfile name="prod">
<root level="INFO">
<appender-ref ref="FILE"/>
</root>
</springProfile>
</configuration>
예제 설명
- Property
- ${LOG_PATH}, ${LOG_FILE_NAME}, ${LOG_PATTERN}으로 재사용 가능한 값을 지정
- 경로나 패턴이 여러 곳에서 반복될 때 유지보수가 쉬움
- ConsoleAppender
- 개발 환경에서만 사용 (운영 환경에서는 콘솔 로그 최소화)
- RollingFileAppender
- 날짜별 로그 파일 생성 (%d{yyyy-MM-dd})
- 30일치만 보관 (<maxHistory>30</maxHistory>)
- springProfile
- spring.profiles.active 값에 따라 로깅 전략 변경 가능
- 예: application-dev.yml → DEBUG, application-prod.yml → INFO
'프로젝트' 카테고리의 다른 글
| 테스트 커버리지 점진적으로 높이기 (1) | 2025.08.25 |
|---|---|
| JaCoCo + Codecov로 CI 테스트 커버리지 관리하기 (4) | 2025.08.25 |
| Spring Boot에서 요청 로그에 userId와 requestId 추가하기 (MDC + Logback) (3) | 2025.08.07 |
| EC2에서 RDS 접속하기 (0) | 2025.05.15 |
| aws 배포 - EC2, RDS, ElastiCache (0) | 2025.03.14 |