Google AdSense (text)

hidden logo stop

Moving

거지 같은 이글루스 광고노출 정책이 싫어서,
새 보금자리(http://blog.leocat.kr/)로 이사감.

[log4j] logging 설정 Computer & Program

이 포스트는 log4j 설정에 관한 단순 기록용이고, 참고용임을 미리 밝힘.

log4j를 사용해서 log를 남길 때 내가 원하는 형식으로 남길 수 있다. log 파일을 날짜별로 매일 생성할 수도 있고, 내가 원하는 최대 사이즈를 지정해서 생성할 수도 있다. 또한, 내가 원하는 패턴을 이용해서 기록을 남길 수도 있다. 간단한 것들은 다른 여러 참조 사이트나 매뉴얼이 많으니 여기서는 단순 기록용으로 내가 필요한 것들만 모아 모아서 @ㅅ@

log4j의 설정은 log4j.properties 파일에서 할 수 있다. 그리고 실행 시 이 log4j.properties 파일을 CLASS_PATH에 넣어두면 logging 시 알아서 이 설정을 이용해서 로그를 남긴다.

log4j:WARN No appenders could be found for logger (LOGGER_NAME).
log4j:WARN Please initialize the log4j system properly.

간혹 위와 같은 경고 메시지를 받는다면 log4j의 설정을 하지 않아서 생기는 문제이다. log4j.properties 파일에 log4j 설정 내용을 넣고 CLASS_PATH에 넣어두자.



log4j.logger.test.library=DEBUG, TEST
log4j.appender.TEST=org.apache.log4j.RollingFileAppender
log4j.appender.TEST.MaxFileSize=100MB
log4j.appender.TEST.MaxBackupIndex=4
log4j.appender.TEST.File=./logs/test.log
log4j.appender.TEST.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST.layout.ConversionPattern=%d %-5p [%t] %l: %m%n

위의 설정은 "test.library"라는 이름의 logger의 설정 내용이다. 소스코드에서 Logger.getLogger("test.library"); 등과 같이 logger의 설정을 찾아 사용할 수 있다. 이 logger 이름을 package 이름으로 설정하면 해당 package에서 남기는 모든 log는 이 설정 파일을 사용할 수 있다. (물론, 필요에 따라 다른 파일로 남기게 설정할 수도 있다.) 무슨 말인고 하면 아래 코드를 보자.
아래 코드의 logger 3개는 모두 위의 logger 설정을 따른다. logger1은 해당 클래스의 패키지 이름이 "test.library"로 시작하기 때문에 위의 "test.library" logger의 설정을 따르고, logger2와 logger3도 클래스가 아닌 문자열로 주어졌지만 logger1과 마찬가지로 "test.library"로 시작하기 때문에 위의 logger 설정을 따른다.

package test.library;

import org.apache.log4j.Logger;

public class LoggingPropertiesTest
{
    public static void main(String [] args)
    {
        Logger logger1 = Logger.getLogger(LoggingPropertiesTest.class);
        logger1.debug("Debug Test");
        Logger logger2 = Logger.getLogger("test.library");
        logger2.debug("Debug Test");
        Logger logger3 = Logger.getLogger("test.library.subPackage");
        logger3.debug("Debug Test");
    }
}

사실 log4j 소스 코드를 보면 Logger.getLogger(Class)는 Logger.getLogger(String)을 사용한다. 아래는 그 소스 코드이다.

static
public
Logger getLogger(Class clazz) {
  return LogManager.getLogger(clazz.getName());
}




또한, rootLogger를 설정할 수 있다. root logger는 모든 logger의 parent logger로 logger가 log를 남길 때 함께 log를 남길 수 있다. 하지만, 이는 additivity 플래그를 false로 설정하여 중복으로 log가 남지 않게 할 수 있다. false로 설정하면 parent가 해당 log를 남기지 않는다.

다음 예제를 보자. rootLogger 하나와 logger 2개를 설정하였다. 그리고 각 logger는 log를 중복으로 남기지 않도록 additivity를 false로 설정했다. 그리고 바로 밑에 있는 코드를 실행해 보면 logger1과 logger4는 일치하는 logger가 없기 때문에 root logger가 logging을 담당하고 logger2는 ftp logger가, logger3은 http logger가 logging을 담당한다. 이처럼 같은 프로젝트라고 해도 패키지명이 다르거나 logger를 획득하는 문자열을 달리하여(logger2, logger3) 원하는 log 파일에 logging을 할 수 있다. 또한, 이 경우 해당 문자열이 없는 경우(logger1, logger4) root logger가 받아서 logging을 한다.

log4j.rootLogger=DEBUG, UNCATEGORIZED
log4j.appender.UNCATEGORIZED=org.apache.log4j.RollingFileAppender
log4j.appender.UNCATEGORIZED.MaxFileSize=100MB
log4j.appender.UNCATEGORIZED.MaxBackupIndex=4
log4j.appender.UNCATEGORIZED.File=./logs/uncategorized.log
log4j.appender.UNCATEGORIZED.layout=org.apache.log4j.PatternLayout
log4j.appender.UNCATEGORIZED.layout.ConversionPattern=%d %-5p [%t] %l: %m%n

log4j.logger.util.ftp=DEBUG, FTP
log4j.additivity.util.ftp=false
log4j.appender.FTP=org.apache.log4j.RollingFileAppender
log4j.appender.FTP.MaxFileSize=100MB
log4j.appender.FTP.MaxBackupIndex=4
log4j.appender.FTP.File=./logs/ftp.log
log4j.appender.FTP.layout=org.apache.log4j.PatternLayout
log4j.appender.FTP.layout.ConversionPattern=%d %-5p [%t] %l: %m%n

log4j.logger.util.http=DEBUG, HTTP
log4j.additivity.util.http=false
log4j.appender.HTTP=org.apache.log4j.RollingFileAppender
log4j.appender.HTTP.MaxFileSize=100MB
log4j.appender.HTTP.MaxBackupIndex=4
log4j.appender.HTTP.File=./logs/http.log
log4j.appender.HTTP.layout=org.apache.log4j.PatternLayout
log4j.appender.HTTP.layout.ConversionPattern=%d %-5p [%t] %l: %m%n


package test.library;

import org.apache.log4j.Logger;

public class LoggerPropertiesTest
{
    public static void main(String [] args)
    {
        Logger logger1 = Logger.getLogger(LoggerPropertiesTest.class);
        logger1.debug("Debug Test");
        Logger logger2 = Logger.getLogger("util.ftp");
        logger2.debug("FTP logging test");
        Logger logger3 = Logger.getLogger("util.http");
        logger3.debug("HTTP logging test");
        Logger logger4 = Logger.getLogger("util");
        logger4.debug("Uncategorized logging test");
    }
}


아~~ 뭔 소린지 나도 모르겠으니 단순 기록, 참고용이 분명하다. -ㅅ-;;

핑백

  • Sigel's house made of ice 。。。 : 2009년 내 이글루 결산 2010-01-02 00:38:59 #

    ... sp;/ Sigel's house made of ice 。。。일기 (49회) / Wanna be Sadhu가장 많이 읽힌 글은 [log4j] logging 설정 입니다.가장 대화가 활발했던 글은 사진100제 - #71 백미러 입니다. ( 덧글 8개 )내이글루에 가장 덧글을 많이 쓴 사람은 즈모모 입니다. ... more

덧글

  • 2012/03/30 11:59 # 삭제 답글

    설명이 이해하기 쉽내요.. ^^ 잘 참고하고갑니다
  • Sigel 2012/03/30 17:30 #

    전 제가 다시 봐도 한참을 봐야 알겠는데요 ㅋㅋ
    도움이 되셨다니 조으네요..
댓글 입력 영역

Google AdSense (text/image)