본문 바로가기

Log4j2 RoutingAppender vs RollingFileAppender

@cojoop 2025. 8. 8. 09:37

앞선 포스트에서 Log4j2의 MDC(ThreadContext)를 활용해 로그 분리를 시도하던 중, RoutingAppenderRollingFileAppender의 차이에 대한 궁금증이 생겼다.

 

두 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 조합

마무리

RoutingAppenderRollingFileAppender를 정확히 이해하고 적절히 조합하면, 장애 원인을 신속하게 추적하고 사용자 요청의 흐름을 효과적으로 파악할 수 있다.

 

특히 대규모 API 시스템이나 멀티 테넌트 환경에서는 RoutingAppender를 활용해 요청 유형 또는 파트너사별로 로그를 구조화함으로써, 운영과 분석의 효율성을 크게 높일 수 있다.

cojoop
@cojoop :: cojoop.dev

💻 1년 차 백엔드 개발자

공부하다 생긴 질문들, 실무에서 겪은 문제들을 하나씩 정리합니다 ✍️

목차