[Java] Log4j 로깅 설정 완전 정리
목차

의존성 추가
Maven Repository에서 1.2 jar 중 가장 많이 사용되는 버전을 pom.xml에 추가한다.
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
참고 문서: https://logging.apache.org/log4j/1.2/manual
실습 코드
Ex01.java
import org.apache.log4j.Logger;
public class Ex01 {
static Logger log = Logger.getLogger("com.bit.Ex01");
//레벨 정도 : trace < debug < info < warn < error < fatal
//log4j.properies생성 후 여기서 만 조절을 해줘도 레벨을 변경할 때마다 자바 코드를 바꾸지 않아도 변경이 가능해진다.
public static void main(String[] args) {
String msg = "hello world";
//레벨 6개
log.trace("트레이스 메시지");
log.debug("디버그 모드 메시지");
log.info("정보모드 메시지");
log.warn("경고 메시지");
log.error("에러모드 메시지");
log.fatal("심각모드 메시지");
System.out.println("msg");
Ex02 ex02 = new Ex02();
ex02.func01();
}
}
Ex02.java
package com.bit;
import org.apache.log4j.Logger;
public class Ex02 {
static Logger log = Logger.getLogger("com.bit.Ex02");
//레벨 정도 : trace < debug < info < warn < error < fatal
//log4j.properies생성 후 여기서 만 조절을 해줘도 레벨을 변경할 때마다 자바 코드를 바꾸지 않아도 변경이 가능해진다.
public void func01() {
String msg = "hello world";
//레벨 6개
log.trace("트레이스 메시지");
log.debug("디버그 모드 메시지");
log.info("정보모드 메시지");
log.warn("경고 메시지");
log.error("에러모드 메시지");
log.fatal("심각모드 메시지");
System.out.println("msg");
}
}
log4j.properties (직접 생성)
# Set root logger level to DEBUG and its only appender to A1.
#log4j.rootLogger=DEBUG, A1
# log4j.rootLogger=Warn, A1
#여기서 레벨 조절
# A1 is set to be a ConsoleAppender.
# log4j.appender.A1=org.apache.log4j.ConsoleAppender
# A1 uses PatternLayout.
# log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
################
#log4j.rootLogger=DEBUG, A1
#log4j.appender.A1=org.apache.log4j.ConsoleAppender
#log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# Print the date in ISO 8601 format
#log4j.appender.A1.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
#log4j.logger.com.foo=WARN
################
log4j.rootLogger=debug, stdout, R
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=D:\WebCash\Web\example\example.log
# 이렇게 주면 콘솔에 메시지를 주는 게 아닌 따로 저장소에 로그를 저장한다.
# 콘솔 출력 없이 파일에만 출력하고 싶으면 아래 두 줄을 지우면 된다.
#log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
주의: 로그 파일 경로 설정 시
\대신/를 사용해야 정상 인식된다. 예)D:\Web\example\example.log→D:/Web/example/example.log
로그 레벨
심각도 낮은 순 → 높은 순: TRACE < DEBUG < INFO < WARN < ERROR < FATAL
| 레벨 | 설명 |
|---|---|
| FATAL | 가장 크리티컬한 에러 |
| ERROR | 일반 에러 |
| WARN | 에러는 아니지만 주의 필요 |
| INFO | 일반 정보 |
| DEBUG | 일반 정보를 상세히 출력 |
| TRACE | 가장 낮은 레벨, 세밀한 흐름 추적 |
ConversionPattern 패턴 기호
| 패턴 | 설명 |
|---|---|
%p | 로그 레벨 (debug, info, warn, error, fatal) |
%m | 로그 내용 |
%d | 로깅 이벤트 발생 시간. %d{HH:mm:ss, SSS} 형식 사용 (SimpleDateFormat) |
%t | 로그 이벤트가 발생한 스레드 이름 |
%% | % 기호 출력 |
%n | 플랫폼 종속 개행문자 (\r\n 또는 \n) |
%c | 카테고리. %c{2} → a.b.c에서 b.c 출력 |
%C | 클래스명. %C{2} → org.apache.xyz.SomeClass에서 xyz.SomeClass 출력 |
%F | 로깅이 발생한 프로그램 파일명 |
%l | 로깅이 발생한 caller 정보 |
%L | 로깅이 발생한 라인 수 |
%M | 로깅이 발생한 메서드 이름 |
%r | 애플리케이션 시작 이후 로깅 발생까지의 시간(ms) |
%X | 스레드와 관련된 MDC(mapped diagnostic context) |
%x | 스레드와 관련된 NDC(nested diagnostic context) |
실전 설정 예시 (stdout + DailyRolling)
# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, rolling을 정의
log4j.rootLogger=DEBUG, stdout, rolling
# stdout 어펜더: 콘솔 출력
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{yyyy년 MM월 dd일 HH:mm(ss)}] _%-5p_ [%t] %-17c{2} (%13F:%L) %3x -->내용 : %m%n
# rolling 어펜더: 날짜별 파일 출력
log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
log4j.appender.rolling.File=output.log
# true면 톰캣을 내렸다 올려도 파일이 리셋되지 않는다.
log4j.appender.rolling.Append=true
log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=[%d{yyyy년 MM월 dd일 HH:mm(ss)}] _%-5p_ [%t] %-17c{2} (%13F:%L) %3x -->내용 : %m%n
출처: https://jdkblog.tistory.com/122 [JDK’s blog]