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