본문 바로가기

Java SE/log4j example

log4j example

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("치명적오류 로그");
 }
}





실행결과

DEBUG [main] (Log4jTest01.java:8) - debug message.
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의 구조

: Log4J는 크게 Logger, Appender, Layout의 3가지 요소로 구성되어 있다.


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

: Layout은 org.apache.log4j.PatternLayout을 일반적으로 사용한다.


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