앞선 포스트에서 Log4j2의 MDC(ThreadContext)를 활용해 로그 분리를 시도하던 중, RoutingAppender와 RollingFileAppender의 차이에 대한 궁금증이 생겼다.
두 Appender는 겉보기에는 비슷해 보이지만 전혀 다른 목적과 동작 방식을 가지고 있으며, 이를 명확히 이해하지 않으면 로그 설계가 복잡해지고 운영 효율도 떨어질 수 있다.
따라서 이번 글에서는 두 Appender의 차이점, 사용 목적, 장단점을 비교하고 실제 예제와 함께 어떻게 활용할 수 있는지 정리해보려 한다.
RollingFileAppender란?
RollingFileAppender는 하나의 로그 파일에 지속적으로 로그를 기록하다가, 일정 조건(시간, 용량 등)을 만족하면 자동으로 새 로그 파일로 롤링(Rolling) 해주는 Appender다.
예시
<RollingFile name="FileAppender"
fileName="logs/app.log"
filePattern="logs/app-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d [%t] %-5level %logger - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingFile>
특징
- 시간 또는 용량 기준으로 로그 파일을 분할하여 관리
- 로그 순환 및 백업 관리에 적합
- 보통 하나의 서비스 전체 로그를 기록할 때 사용
- 이름 그대로, 파일이 일정 조건에 도달하면 자동으로 "굴러감(Rolling)"
RoutingAppender란?
RoutingAppender는 이름 그대로 로그를 라우팅(Routing) 하는 데에 특화된 Appender다.
MDC(또는 ThreadContext) 값을 기준으로 동적으로 Appender를 생성하거나 선택하여, 로그 파일을 다르게 분기시킬 수 있다.
예시
<Routing name="RoutingAppender">
<Routes pattern="$${ctx.logType}">
<Route key="SEND">
<RollingFile name="SendLog"
fileName="logs/send.log"
filePattern="logs/send-%d{yyyy-MM-dd}.log.gz">
<PatternLayout pattern="%d [%t] %-5level %logger - %msg%n"/>
<Policies>
<TimeBasedTriggeringPolicy interval="1"/>
</Policies>
</RollingFile>
</Route>
<Route key="RECEIVE">
<RollingFile name="ReceiveLog"
fileName="logs/receive.log"
filePattern="logs/receive-%d{yyyy-MM-dd}.log.gz"/>
</Route>
</Routes>
</Routing>
특징
- MDC, ThreadContext 등의 값을 기반으로 로그를 동적으로 분기
- 요청 유형별, 사용자별, API별 로그 분리에 용이
- 내부적으로 RollingFileAppender를 사용하여 각 분기마다 개별 로그 파일 생성
- 하나의 Appender에서 다수의 목적지(Appender)를 동적으로 라우팅 가능
비교 요약
비교 항목 | RollingFileAppender | RoutingAppender |
목적 | 로그 순환 관리 (시간/용량) | 로그 파일 분기 (조건 기반) |
로그 대상 | 고정된 하나의 파일 | 동적으로 생성된 다수의 파일 |
사용 예 | logs/app.log, logs/error.log | logs/send.log, logs/user_123.log |
유연성 | 낮음 | 높음 |
구성 복잡도 | 간단 | 다소 복잡 (MDC 필요) |
내부 동작 | 고정된 파일 + 롤링 정책 | MDC 값으로 Appender 선택 + 롤링 병행 가능 |
권장 상황 | 단일 로그 파일만 필요한 경우 | 로그를 목적/기준별로 나눠야 할 때 |
언제 어떤 Appender를 써야 할까?
상황 추천 | Appender |
단일 서비스 로그를 간단히 남기고 싶을 때 | RollingFileAppender |
API별, 요청별로 로그를 따로 관리하고 싶을 때 | RoutingAppender |
다수의 테넌트/파트너사별 로그 파일이 필요할 때 | RoutingAppender |
배치, 연동 등 특정 기능별 로그를 추적하고 싶을 때 | RoutingAppender + RollingFileAppender 조합 |
마무리
RoutingAppender와 RollingFileAppender를 정확히 이해하고 적절히 조합하면, 장애 원인을 신속하게 추적하고 사용자 요청의 흐름을 효과적으로 파악할 수 있다.
특히 대규모 API 시스템이나 멀티 테넌트 환경에서는 RoutingAppender를 활용해 요청 유형 또는 파트너사별로 로그를 구조화함으로써, 운영과 분석의 효율성을 크게 높일 수 있다.
'Backend > Spring' 카테고리의 다른 글
Spring 로그 분리 전략(Feat. MDC) (0) | 2025.08.07 |
---|---|
예외 처리, 전역일까? 개별일까? (0) | 2025.08.06 |
효율적인 로깅 설계와 적용 방법 (0) | 2025.07.30 |
DTO가 달라도 공통 로직을 재사용하는 4가지 패턴 (0) | 2025.07.25 |
Spring 레거시 환경에서 snake_case JSON → camelCase DTO 매핑 문제 해결하기 (0) | 2025.07.24 |