Don't Panic
in Java ☕ 1분 읽기

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

목차

20220422_180516

의존성 추가

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.logD:/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]