Log4j는 Apache Software Foundation에서 제공하는 Java 기반의 로깅 라이브러리입니다. 애플리케이션의 실행 상태를 기록하는 데 사용되며, 디버깅, 오류 분석, 성능 모니터링 등에 유용합니다.
Log4j는 다음과 같은 특징을 가집니다:
- 유연한 로깅 레벨: 로그의 심각도에 따라 다양한 레벨(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)을 제공합니다.
- 다양한 출력 대상: 로그를 파일, 콘솔, 데이터베이스, 원격 서버 등 다양한 곳에 출력할 수 있습니다.
- 구성 파일 지원: XML, JSON 또는 .properties 파일로 설정을 관리할 수 있습니다.
- 성능 최적화: 비동기 로깅 및 다양한 최적화 기능 제공.
Log4j의 주요 구성 요소
Log4j는 크게 Logger, Appender, Layout 세 가지 요소로 구성됩니다:
- Logger: 로그 메시지를 생성하고 로깅 레벨을 제어하는 역할.
- Appender: 로그 메시지의 출력 대상을 결정하는 역할 (예: 콘솔, 파일).
- Layout: 로그 메시지의 형식을 지정하는 역할 (예: 날짜, 로그 레벨, 메시지).
Log4j의 로깅 레벨
로그 레벨은 로그의 중요도에 따라 설정됩니다. 각 레벨은 아래와 같습니다:
로그 레벨설명
TRACE | 가장 상세한 로그로, 디버깅용 세부 정보. |
DEBUG | 개발 단계에서 유용한 디버깅 정보. |
INFO | 일반적인 정보 메시지. |
WARN | 잠재적인 문제를 경고하는 메시지. |
ERROR | 오류가 발생했지만 애플리케이션이 계속 실행 가능. |
FATAL | 심각한 오류로 인해 애플리케이션이 종료될 수 있음. |
Log4j 설정 파일 예제
(1) log4j.properties 예제
properties
코드 복사
# Root logger 설정
log4j.rootLogger=DEBUG, console, file
# Console 출력 설정
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n
# File 출력 설정
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=app.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n
(2) log4j.xml 예제
xml
<configuration>
<appender name="Console" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n"/>
</layout>
</appender>
<appender name="File" class="org.apache.log4j.FileAppender">
<param name="File" value="app.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p %c - %m%n"/>
</layout>
</appender>
<root>
<priority value="DEBUG"/>
<appender-ref ref="Console"/>
<appender-ref ref="File"/>
</root>
</configuration>
Log4j 사용법
1. Logger 생성
Log4j를 사용하려면 Logger 객체를 생성합니다:
java
import org.apache.log4j.Logger;
public class Log4jExample {
private static final Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.trace("This is a TRACE message");
logger.debug("This is a DEBUG message");
logger.info("This is an INFO message");
logger.warn("This is a WARN message");
logger.error("This is an ERROR message");
logger.fatal("This is a FATAL message");
}
}
2. 주요 메서드
메서드설명
logger.trace(String msg) | TRACE 레벨의 로그 메시지를 출력합니다. |
logger.debug(String msg) | DEBUG 레벨의 로그 메시지를 출력합니다. |
logger.info(String msg) | INFO 레벨의 로그 메시지를 출력합니다. |
logger.warn(String msg) | WARN 레벨의 로그 메시지를 출력합니다. |
logger.error(String msg) | ERROR 레벨의 로그 메시지를 출력합니다. |
logger.fatal(String msg) | FATAL 레벨의 로그 메시지를 출력합니다. |
logger.isDebugEnabled() | DEBUG 레벨이 활성화되어 있는지 확인합니다. |
logger.isInfoEnabled() | INFO 레벨이 활성화되어 있는지 확인합니다. |
Log4j와 Log4j 2
- Log4j 1.x: 위에서 설명한 버전으로 오래된 시스템에서 여전히 사용됩니다.
- Log4j 2.x: Log4j 1.x의 성능 및 보안 문제를 개선한 최신 버전으로, 비동기 로깅과 동적 로깅 구성이 가능합니다. Log4j 1.x는 더 이상 유지보수되지 않으므로 가능하면 Log4j 2를 사용하는 것이 권장됩니다.
Log4j 관련 보안 이슈
Log4j 2에서 Log4Shell(CVE-2021-44228) 취약점이 발견되었습니다. 공격자가 악의적인 데이터를 이용해 원격 코드 실행(RCE)을 할 수 있는 문제입니다.
해결 방법:
- Log4j를 2.16.0 이상으로 업그레이드하세요.
- JNDI 기능을 비활성화하거나 보안 패치를 적용합니다.