JAVA/LOG4J 2009. 5. 7. 16:19

System.out.println()을 사용하면 되는데 굳이 logger를 사용할 필요가 있을까?

logger를 사용하면, 다음과 같은 장점들이 있다.

- 로그 레벨별로 logging 여부를 결정할 수 있다.
- 로그를 콘솔뿐만 아니라 파일 등에 쓸 수 있다.
- 레벨이나 appender 설정을 파일에서 할 수 있다.

가장 보편적으로 사용되는 Apache Log4J를 사용해보자.

우선 log4j.properties 파일을 다음과 같이 작성한다.

log4j.rootLogger=ALL, console, another_appender

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%c:%p] - %m%n

log4j.appender.another_appender=org.apache.log4j.RollingFileAppender
log4j.appender.another_appender.File=log/example.log

log4j.appender.another_appender.MaxFileSize=100KB
# Keep one backup file
log4j.appender.another_appender.MaxBackupIndex=1

log4j.appender.another_appender.layout=org.apache.log4j.PatternLayout
log4j.appender.another_appender.layout.ConversionPattern=%d [%c:%p] - %m%n

log4j.properties 파일을 클래스 패스에 포함시켜야만 Log4J가 찾을 수 있다.

이클립스를 사용한다면, properties 폴더에 log4j.properties 파일을 넣고,

Build Path -> Use as Source Folder를 선택한다.

다음으로 Log4J를 사용하는 클래스를 작성한다.

package com.izeye.log4jexample;

import org.apache.log4j.Logger;

public class Log4JExample {
 
 private static final Logger logger = Logger.getLogger(Log4JExample.class);
 private static final Logger anotherLogger = Logger.getLogger("another");
 
 public static void main(String[] args) {
  String message = "TEST MESSAGE";
  while (true) {
   logger.debug(message);
   logger.info(message);
   logger.warn(message);
   logger.error(message);
   logger.fatal(message);
   
   anotherLogger.debug(message);
   anotherLogger.info(message);
   anotherLogger.warn(message);
   anotherLogger.error(message);
   anotherLogger.fatal(message);
   
   try {
    Thread.sleep(10000);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }
 
}

위 클래스를 실행하면, 콘솔의 결과는 다음과 같다.

2009-02-04 19:26:58,375 [com.izeye.log4jexample.Log4JExample:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,375 [com.izeye.log4jexample.Log4JExample:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [com.izeye.log4jexample.Log4JExample:FATAL] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:DEBUG] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:INFO] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:WARN] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:ERROR] - TEST MESSAGE
2009-02-04 19:26:58,390 [another:FATAL] - TEST MESSAGE
......

log/example.log의 내용도 위와 동일하다.

log4j.rootLogger는 모든 logger의 부모 logger이다.

따라서 등록된 모든 logger가 이 logger의 설정에 영향을 받는다.

com.izeye.log4jexample.Log4JExample 클래스 logger는

WARN 이상의 메시지만 콘솔로 출력하고,

'another' logger는 ERROR 이상의 메시지만

log/example.log 파일로 출력하도록 하기 위해서 다음과 같이 수정한다.

#log4j.rootLogger=ALL, console, another_appender

log4j.logger.com.izeye.log4jexample.Log4JExample=WARN, console

log4j.logger.another=ERROR, another_appender

posted by 나는너의힘
: