Log4j2는 Spring Boot 기본 로깅 프레임워크인 Logback을 대체하여 사용할 수 있는 고성능 로깅 라이브러리입니다. 기본적으로 Spring Boot는 spring-boot-starter-logging을 통해 Logback을 포함하고 있지만, 이를 제거하고 직접 Log4j2를 적용하면 더 유연한 로깅 구성이 가능합니다.
먼저 의존성을 조정하여 기존 로깅 프레임워크를 제거하고, 대신 Log4j2를 활성화해야 합니다:
<dependencies>
<!-- Logback 제외 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Log4j2 추가 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
<version>2.7.10</version>
</dependency>
</dependencies>
Log4j2의 설정은 log4j2.xml 파일로 구성되며, 주요 요소는 다음과 같습니다:
-
Configuration: 최상위 노드로
status와monitorInterval속성을 제공합니다. -
status: Log4j2 자체의 내부 로그 출력 수준 (예:warn,trace). -
monitorInterval: 설정 파일 변경 감지를 위한 간격(초 단위), 최소 5초 이상 권장. -
Appenders: 로그 출력 대상을 정의합니다. 주요 유형은
Console,File,RollingFile입니다. -
Console: 콘솔에 출력.target은SYSTEM_OUT또는SYSTEM_ERR. -
File: 지정된 경로에 일괄적 파일 출력. -
RollingFile: 크기 또는 시간 기반으로 자동 롤링되는 파일 출력. -
filePattern: 생성될 파일 이름 패턴 (예:%d{yyyy-MM-dd}). -
Policies: 롤링 전략. -
TimeBasedTriggeringPolicy: 시간 기반 (예: 매시간). -
SizeBasedTriggeringPolicy: 파일 크기 기반 (예: 10MB 이상 시 롤링). -
DefaultRolloverStrategy: 보관 파일 최대 개수 (max속성). -
Loggers: 특정 패키지나 클래스에 대한 로그 설정을 지정합니다.
-
Root: 전체 애플리케이션의 기본 로그 설정. -
Logger: 특정 패키지/클래스에 대해 별도 설정. -
level: 출력 레벨 (INFO, DEBUG 등). -
additivity: 부모 로거의 출력을 상속할지 여부 (false시 자식만 출력).
다음은 실제 사용 가능한 예시 설정 파일입니다:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN"
value="%d{HH:mm:ss.SSS} [%t] %-5p %c{36} :: %m%n" />
<Property name="LOG_PATH" value="c:/logs/dimples" />
<Property name="PROJECT_NAME" value="dimples-app" />
</Properties>
<Appenders>
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="${LOG_PATTERN}" />
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
</Console>
<RollingRandomAccessFile name="APP_LOG"
fileName="${LOG_PATH}/${PROJECT_NAME}.log"
filePattern="${LOG_PATH}/history/${PROJECT_NAME}-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" modulate="true" />
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="100" />
</RollingRandomAccessFile>
<RollingRandomAccessFile name="ERROR_LOG"
fileName="${LOG_PATH}/errors/${PROJECT_NAME}-error.log"
filePattern="${LOG_PATH}/errors/${PROJECT_NAME}-error-%d{yyyy-MM-dd}-%i.log.gz">
<PatternLayout pattern="${LOG_PATTERN}" />
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY" />
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
</Policies>
<DefaultRolloverStrategy max="50" />
</RollingRandomAccessFile>
</Appenders>
<Loggers>
<Logger name="com.example.service" level="debug" additivity="false">
<AppenderRef ref="APP_LOG" />
</Logger>
<Logger name="com.example.controller" level="info" additivity="false">
<AppenderRef ref="APP_LOG" />
</Logger>
<Root level="info">
<AppenderRef ref="CONSOLE" />
<AppenderRef ref="APP_LOG" />
<AppenderRef ref="ERROR_LOG" />
</Root>
</Loggers>
</Configuration>
이 설정은 콘솔과 파일 출력을 분리하고, 오류 로그는 별도로 관리하며, 각 모듈별로 로그 수준을 세밀하게 제어할 수 있도록 구성되어 있습니다. 또한 파일 롤링과 유지 정책을 통해 장기간 운영 시에도 로그 파일 관리가 용이해집니다.
이처럼 Log4j2는 다양한 출력 대상과 조건 기반의 로그 처리를 가능하게 하여, 대규모 애플리케이션에서 효과적인 로깅 전략을 구현할 수 있습니다.