<configuration>
<!-- 1. 전역 변수 -->
<property ... />
<!-- 2. 로그 출력 대상 (Appender) -->
<appender ... />
<appender ... />
<!-- 3. 로그 필터 및 로거 설정 -->
<root level="INFO">
<appender-ref ... />
</root>
</configuration>
즉, logback.xml은 **“로깅 파이프라인”**을 설정하는 파일이에요.
[코드 → SLF4J Logger → Logback → Appender(Console/File 등)]
이렇게 흘러가는 과정을 정의합니다.
<property name="LOG_PATH" value="./logs" />
<property name="LOG_FILE" value="${LOG_PATH}/app.log" />
역할:
💡 예를 들어,
./logs/app.log → "현재 프로젝트 폴더(logs)" 안에 로그 파일 생성
다른 경로로 바꾸려면 한 곳만 수정하면 됨 (유지보수 편리)
Logback에서는 로그를 “어디에 쓸지”를 Appender로 정의합니다.
보통 콘솔(ConsoleAppender)과 파일(RollingFileAppender) 2개를 함께 사용합니다.
<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>
설명:
예시 출력:
2025-11-03 13:50:21.123 [main] INFO org.example.MyServer - 서버 시작
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
설명:
동작 예시:
logs/
├─ app.log (오늘 로그)
├─ app.2025-11-02.log
├─ app.2025-11-01.log
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
설명:
레벨 계층 구조 (낮을수록 상세 로그):
TRACE → DEBUG → INFO → WARN → ERROR
예시:
LoggerFactory.getLogger(MyClass.class)
↓
Logback이 로드됨 (logback.xml 파싱)
↓
Logger 객체 생성
↓
logger.info("서버 시작") 호출
↓
<root>에서 지정한 Appender 두 곳으로 출력
↓
Console: 터미널에 로그 출력
File: logs/app.log 파일에 기록
기능 설정 예시
| 로그 레벨별 색상 출력 | <withJansi>true</withJansi> 추가 |
| 특정 패키지만 별도 레벨 지정 | <logger name="org.example.dao" level="DEBUG" /> |
| 로그 파일 최대 크기 기준 롤링 | <SizeBasedTriggeringPolicy maxFileSize="10MB" /> |
| AsyncAppender (비동기 로그) | <appender class="ch.qos.logback.classic.AsyncAppender"> |
| 구분 | 역할 | 예시 |
| <property> | 경로·파일명 변수 선언 | ${LOG_PATH} |
| <appender> | 로그 출력 위치 정의 | Console, File 등 |
| <encoder> | 로그 메시지 형식 | %d [%thread] %level %msg |
| <rollingPolicy> | 로그 파일 교체 규칙 | 일자별 롤링, 보관일수 |
| <root> | 전체 로그 최소 레벨 + Appender 연결 | INFO, 콘솔+파일 출력 |
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_PATH" value="./logs" />
<property name="LOG_FILE" value="${LOG_PATH}/app.log" />
<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>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/app.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</configuration>
만약 Gradle 프로젝트였다면
→ src/main/resources/logback.xml 위치는 동일하고,
→ 다만 설정 파일 생성도 직접 수동으로 만들어야 합니다.

| POST요청과 GET요청의 차이점 (0) | 2025.11.21 |
|---|---|
| Base64 인코딩, 디코딩, AES-GCM 모드란? (예제 코드포함) (0) | 2025.11.18 |
| Intellij 인텔리제이 공부하기 - pom.xml 파일 역할, 사용 방법 (0) | 2025.11.06 |
| APP api 연동방식에서 STM방식, App방식 각각 개념과 차이점은? (0) | 2025.11.05 |
| PUID란? (5) | 2025.08.16 |