1. Log4j의 핵심 구성 요소
Apache Log4j는 자바 기반의 로깅 프레임워크로, 애플리케이션의 실행 상태를 기록하고 관리하는 데 사용됩니다. 주요 구성 요소는 크게 세 가지로 나뉩니다.
- Logger: 로그 메시지를 수집하고 필터링하는 역할을 합니다. 로그 레벨에 따라 어떤 메시지를 출력할지 결정하며, 계층 구조를 가집니다. 최상위에는
rootLogger가 존재하며 모든 로거는 이를 상속받습니다. - Appender: 로그가 출력될 대상(Destination)을 정의합니다. 콘솔, 파일, 네트워크, 데이터베이스 등 다양한 위치로 로그를 보낼 수 있습니다.
- Layout: 로그 메시지의 최종 출력 형태를 결정합니다. Appender가 로그를 쓰기 전에 특정 포맷으로 변환하는 과정을 담당합니다.
2. 로그 레벨(Log Levels)
Log4j는 5단계의 기본 로그 레벨을 제공하며, 각 레벨은 우선순위를 가집니다. 설정된 레벨보다 높은 우선순위의 로그만 출력됩니다.
DEBUG < INFO < WARN < ERROR < FATAL
예를 들어, 로거 레벨을 INFO로 설정하면 DEBUG 메시지는 무시되고 INFO 이상의 메시지만 기록됩니다.
3. Appender 유형 및 설정
로그를 어디에 기록할지 결정하는 주요 Appender 클래스는 다음과 같습니다.
| 클래스명 | 설명 |
|---|---|
org.apache.log4j.ConsoleAppender |
콘솔 화면(표준 출력)으로 로그 전송 |
org.apache.log4j.FileAppender |
지정한 파일에 로그 기록 |
org.apache.log4j.DailyRollingFileAppender |
설정한 주기(일, 월 등)마다 새 로그 파일 생성 |
org.apache.log4j.RollingFileAppender |
파일 크기가 일정 수준에 도달하면 백업 후 새 파일 생성 |
org.apache.log4j.WriterAppender |
문자 스트림을 통해 지정된 위치로 로그 전송 |
Appender 주요 옵션
- Threshold: 해당 Appender에서 출력할 최소 로그 레벨을 지정합니다.
- ImmediateFlush: 기본값은
true이며, 메시지가 즉시 출력되도록 설정합니다. - File: 로그를 저장할 파일의 경로와 이름을 지정합니다.
- Append:
true이면 기존 파일 내용 뒤에 추가하고,false이면 기존 내용을 덮어씁니다.
4. Layout 및 패턴 포맷팅
로그의 형식을 지정할 때 PatternLayout을 가장 많이 사용하며, 다음과 같은 특수 문자를 통해 정보를 조합합니다.
%p: 로그 레벨(DEBUG, INFO 등) 출력%d: 로그 발생 시간 출력 (예:%d{yyyy-MM-dd HH:mm:ss})%c: 해당 로그가 발생한 클래스의 전체 경로%m: 로그 메시지 본문%n: 줄바꿈 문자%t: 로그를 생성한 스레드명%L: 소스 코드 내의 라인 번호
5. Log4j 구현 예시
Java 테스트 코드
package com.tech.guide;
import org.apache.log4j.Logger;
public class LogExample {
// 로거 인스턴스 생성
private static final Logger traceLog = Logger.getLogger(LogExample.class);
public static void main(String[] args) {
// 다양한 레벨의 로그 기록
traceLog.debug("상세 분석용 데버깅 메시지");
traceLog.info("일반적인 실행 정보 안내");
traceLog.warn("잠재적인 문제가 발생할 수 있는 경고");
traceLog.error("런타임 에러 또는 비정상적인 상황 발생");
}
}
log4j.properties 설정 파일
# Root 로거 설정: 레벨은 INFO이며 콘솔과 파일(D, E)에 출력하도록 설정
log4j.rootLogger = INFO, console, D, E
# 콘솔 출력 설정
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%p] %d{HH:mm:ss} - %m%n
# 전체 로그 파일 저장 설정 (날짜별 롤링)
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = /logs/app_debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c - %m%n
# 에러 전용 로그 파일 저장 설정
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = /logs/app_error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ERROR] %l - %m%n