log4j 1.2 manual : http://logging.apache.org/log4j/1.2/manual.html
log4j download : http://logging.apache.org/log4j/1.2/download.html
log4j.properties
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=c:/log/example.log
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
위의 설정파일을 사용하는 예제 소스
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class Log4jTest01 {
static Logger logger = Logger.getLogger(Log4jTest01.class);
public static void main(String[] args) {
logger.setLevel(Level.DEBUG); /* 설정파일의 레벨설정을 오버라이드하여 새로 설정하는 예 */
logger.debug("bebug message.");
logger.info("info message.");
logger.warn("warn message.");
logger.error("error message.");
logger.fatal("fatal message.");
}
}
만약 apache-commons-logging 라이브러리를 함께 사용하고 있다면 다음과 같은 방법으로 인스턴스를 생성할 수도 있다.
//import org.apache.log4j.Level;
//import org.apache.log4j.Logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class Main {
/**
* apache-commons-logging.jar 를 이용하여 로깅하는 예
* 아래에서 사용된 LogFactory.getLog()메소드는 JDK 1.4부터 포함된 Logger API나 log4j를 이용하여 로깅 인스턴스를 생 성한다. LogFactory는 자체에서 로깅 인스턴스를 생성하는 것이 아니다.
*/
public static void main(String[] args) {
//Logger log = Logger.getLogger(Main.class);
//log.setLevel(Level.WARN);
/* Apache commons-logging 라이브러리를 사용한다면 다음과 같이 할 수도 있다 */
Log log = LogFactory.getLog(Main.class);
log.debug("디버그 로그");
log.info("인포 로그");
log.warn("경고 로그");
log.error("에러 로그");
log.fatal("치명적오류 로그");
}
}
실행결과
INFO [main] (Log4jTest01.java:9) - info message.
WARN [main] (Log4jTest01.java:10) - warn message.
ERROR [main] (Log4jTest01.java:11) - error message.
FATAL [main] (Log4jTest01.java:12) - fatal message.
log4j.properties (DailyRollingFileAppender사용예)
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.DailyRollingFileAppender
log4j.appender.R.File=c:/log/example.log
#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
설정파일은 CLASSPATH로 지정한 디렉토리에 두면 되고 Eclipse에서는 소스파일과 함께 위치하면 된다.
출력 Level 설정은 설정파일의 맨 위에서 log4j.rootLogger=debug, stdout, R 와 같이 설정하면 된다.
Lo4J의 로그레벨(내림차순)
- Level.FATAL : 치명적인 에러
- Level.ERROR : 에러
- Level.WARN : 경고
- Level.INFO : 정보
- Level.DEBUG : 상세정보
Log4J의 구조
Appender
- org.apache.log4j.ConsoleAppender : 콘솔에 로그메시지 출력
- org.apache.log4j.FileAppender : 파일에 로그 메시지를 기록
- org.apache.log4j.RollingFileAppender : 파일에 로그 메시지를 기록하며, 파일이 일정 크기가 되면 다른 이름으로 저장하고, 새롭게 로그 메시지를 기록하기 시작한다.
- org.apache.log4j.DailyRollingFileAppender : 파일에 로그 메시지를 기록하며, 하루단위로 로그파일 변경
- org.apache.log4j.net.SMTPAppender : 로그메시지를 이메일로 전송한다.
- org.apache.log4j.nt.NTEventLogAppender : NT의 이벤트 로그 시스템에 로그 메시지를 전송한다. 윈도우즈 시스템만 사용 가능
Layout
PatternLayout에서 지원하는 패턴
형식 | 설명 |
%p | debug, info, warn, error, fatal 등의 priority 가 출력된다. |
%m | 로그내용이 출력됩니다 |
%d | 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS}같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다 |
%t | 로그이벤트가 발생된 쓰레드의 이름을 출력합니다. |
%% | % 표시를 출력하기 위해 사용한다. |
%n | 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다. |
%c | 카테고리를 표시합니다 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다. |
%C | 클래스명을 포시합니다. 예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다 |
%F | 로깅이 발생한 프로그램 파일명을 나타냅니다. |
%l | 로깅이 발생한 caller의 정보를 나타냅니다 |
%L | 로깅이 발생한 caller의 라인수를 나타냅니다 |
%M | 로깅이 발생한 method 이름을 나타냅니다. |
%r | 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) |
%x | 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다. |
%X | 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. |
ConversionPattern 설정 예
[%d] %-5p %l - %m%n
%-5p - %m%n
[%d] %-5p - %m%n
Log4J 설정파일 다루기
log4j.rootLogger = [level], appender_name, ...
log4.logger.logger_name = [level|INHERITED], appender_name,...
log4j.additivity.logger_name = true|false
log4j.appender.appender_name = [appender_calss_name]
log4j.appender.appender_name.option1 = value1
log4j.appender.appender_name.option2 = value2
log4j.appender.appender_name.layout = [layout_calss_name]
log4j.appender.appender_name.layout.option1 = value1
log4j.appender.appender_name.layout.option2 = value2