Log4j2.properties 파일 설정 가이드
Log4j2.properties 파일을 이용해 콘솔, 롤링 파일 등으로 로그를 출력하는 방법을 배웁니다. Log4j2의 appender, 로그 레벨, 패턴 설정 방법을 알아봅니다.
1. Log4j2 Maven 의존성
Log4j2를 단독으로 사용하지만, SLF4J와 함께 사용하는 것을 권장합니다. 관련 내용은 별도 자료를 참고하세요.
1.1 Maven
Log4j2를 사용하려면 최신 버전의 log4j-core와 log4j-api 의존성을 추가하세요.
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.22.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.22.0</version>
</dependency>
1.2 Gradle
dependencies {
implementation 'org.apache.logging.log4j:log4j-api:2.19.0'
implementation 'org.apache.logging.log4j:log4j-core:2.19.0'
}
2. 기본 로깅 동작
다음 조건에서 기본 동작이 활성화됩니다:
- 시작 파라미터에
log4j.configurationFile속성이 지정되지 않았거나, 유효한 설정 파일을 가리키지 않는 경우 - 클래스패스에 유효한
log4j2-test.[xml|properties|yaml|json]설정 파일이 없는 경우 - 클래스패스에
log4j2.[xml|properties|yaml|json]설정 파일이 없는 경우
기본적으로 Log4j2는 ConsoleAppender를 사용해 콘솔에 로그를 출력합니다. 루트 로거의 기본 레벨은 error이며, ERROR 레벨만 출력되고 INFO, DEBUG, TRACE 레벨은 보이지 않습니다.
3. 콘솔 출력을 위한 log4j2.properties 설정
아래 설정 파일을 사용해 콘솔로 로그를 출력할 수 있습니다. 설정 파일이 없으면 DefaultConfiguration이 사용되어 콘솔에 출력됩니다.
# log4j2.properties
status = warn
name = ConsoleLogConfigDemo
# Console appender 설정
appender.console.type = Console
appender.console.name = consoleLogger
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# 루트 로거 레벨
rootLogger.level = debug
# 루트 로거가 console appender 참조
rootLogger.appenderRef.stdout.ref = consoleLogger
4. 롤링 파일 출력을 위한 log4j2.properties 설정
아래 설정을 통해 시간과 크기 기반 롤링 파일로 로그를 출력할 수 있습니다.
# log4j2.properties
status = warn
name= RollingFileLogConfigDemo
# 로그 파일 경로
property.basePath = c:/temp/logs
# RollingFileAppender 설정
appender.rolling.type = RollingFile
appender.rolling.name = fileLogger
appender.rolling.fileName= ${basePath}/app.log
appender.rolling.filePattern= ${basePath}/app_%d{yyyyMMdd}.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%l] - %msg%n
appender.rolling.policies.type = Policies
# 롤링 정책
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size = 10MB
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.delete.type = Delete
appender.rolling.strategy.delete.basePath = ${basePath}
appender.rolling.strategy.delete.maxDepth = 10
appender.rolling.strategy.delete.ifLastModified.type = IfLastModified
# 30일 이상 된 파일 삭제
appender.rolling.strategy.delete.ifLastModified.age = 30d
# 루트 로거 설정
rootLogger.level = debug
rootLogger.appenderRef.rolling.ref = fileLogger
5. log4j2.properties 파일 위치 및 로드 방법
log4j2.properties 파일을 애플리케이션 클래스패스 내 아무 위치에 두면 됩니다. Log4j2가 클래스패스를 스캔해 파일을 찾아 로드합니다. 일반적으로 resource 폴더에 넣습니다.
외부 설정 파일을 사용하려면 애플리케이션 시작 파라미터나 시스템 속성 log4j2.configurationFile로 경로를 지정합니다. URL도 가능합니다.
-Dlog4j2.configurationFile=file:/home/lokesh/log4j2.properties
JUnit 테스트에서는 @BeforeAll 메서드에서 이 속성을 설정해 사용할 수 있습니다.
6. 예제
Java 클래스를 작성해 로그가 콘솔과 파일에 출력되는지 확인해보겠습니다. SLF4J LoggerFactory와 getLogger()로 Logger 인스턴스를 생성하고, info(), error(), debug() 메서드로 로그를 기록합니다.
// Main.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
public static void main(final String[] args) {
Logger logger = LoggerFactory.getLogger(Main.class);
logger.debug("Debug 메시지 기록됨 !!!");
logger.info("Info 메시지 기록됨 !!!");
logger.error("Error 메시지 기록됨 !!!", new NullPointerException("NullError"));
}
}
프로그램을 실행하면 콘솔에 다음과 같은 로그가 출력됩니다.
2021-12-14 14:26:32.737 DEBUG [main] [Main.main (Main.java:10)] - Debug 메시지 기록됨 !!!
2021-12-14 14:26:32.739 INFO [main] [Main.main (Main.java:11)] - Info 메시지 기록됨 !!!
2021-12-14 14:26:32.739 ERROR [main] [Main.main (Main.java:12)] - Error 메시지 기록됨 !!!
java.lang.NullPointerException: NullError
at Main.main (Main.java:12) [classes/:?]