본문 바로가기

WEB_Programming

Log4J 설정

각 모듈별 설명

다운로드

구조

  • Log4j는 크게 3가지 요소로 구성되어 있습니다.
    1. Logger : logging 메시지를 Appender에 전달합니다.
    2. Appender : 전달받은 logging 메시지를 원하는 곳으로 보내는 매개체의 역할을 합니다.
      ConsoleAppender : 로그 메시지를 콘솔에 출력합니다.
      DailyRollingFileAppender : 로그 메시지를 파일로 저장합니다.
      DatePattern : 옵션에 따라 원하는 기간마다 로그파일을 갱신합니다.
      ExternallyRolledFileAppender :
      FileAppender : 직접적으로 사용되지 않고 DailyRollingFileAppender와 RollingFileAppender의 superclass로 사용되는듯 합니다.
      JDBCAppender : 로그 메시지를 DB에 저장합니다. 현재는 완벽하지 않으니 왠만하면 차기 버전에서 사용하라고 하는 것 같습니다.
      JMSAppender : 로그 메시지를 JMS Topic으로 보냅니다.
      NTEventLogAppender : NT 이벤트 로그를 위한 Appender. 윈도우에서만 사용가능합니다.
      NullAppender : 내부적으로만 사용되는 Appender입니다.
      RollingFileAppender : 로그 메시지를 파일로 저장합니다. 설정된 size를 초과하면 로그파일이 갱신됩니다.
      SMTPAppender : 로그 메시지를 지정된 이메일로 발송합니다.
      SocketAppender : 로그 메시지를 socket을 이용해서 지정된 곳으로 보냅니다.
      SocketHubAppender : 위와 비슷하게 사용하는듯 합니다.
      SyslogAppender : 로그 메시지를 원격 syslog deamon으로 보냅니다.
      TelnetAppender : 로그 메시지를 telnet을 통해 보낸다는 것 같습니다. 원격 모니터링, 특히 servlet의 모니터링에 유용하다고 합니다.
      WriterAppender : FileAppender처럼 주로 superclass로서 사용되는듯 합니다.
    3. Layout : logging 메시지의 출력 형식을 지정합니다.

로깅레벨

FATAL : 가장 크리티컬한 에러가 발생했을 때 사용합니다.
ERROR : 일반적인 에러가 발생했을 때 사용합니다.
WARN : 에러는 아니지만 주의가 필요할 때 사용합니다.
INFO : 일반적인 정보가 필요할 때 사용합니다.
DEBUG : 일반적인 정보를 상세히 나타낼 때 사용합니다.

환경설정

  • Log4j의 환경설정은 직접 코드에서 메서드를 이용하는 방법
    줄 번호 보이기/숨기기
       1 String layout = "%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n";
    2 String logfilename = "DailyLog.log";
    3 String datePattern = ".yyyy-MM-dd ";
    4
    5 PatternLayout patternlayout = new PatternLayout(layout);
    6 DailyRollingFileAppender appender = new DailyRollingFileAppender(patternlayout, logfilename, datePattern);
    7 logger.addAppender(appender);
    8 logger.setLevel(Level.INFO);
    9 logger.fatal("fatal!!");
    10
  • properties 파일을 이용하는 방법
    줄 번호 보이기/숨기기
       1 #---------- file logging ----------
    2 log4j.rootLogger=INFO, rolling
    3 #---------- consol logging -----------
    4 #log4j.rootLogger=INFO, stdout
    5 #---------- file, console logging -----------
    6 #log4j.rootLogger=INFO, stdout, rolling
    7 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    8 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    9 log4j.appender.stdout.layout.ConversionPattern=[%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n
    10 log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender
    11 log4j.appender.rolling.File=/WEB_BACKUP1/pgw_log/webchannel.log
    12 log4j.appender.rolling.Append=true
    13 #---------- every day renew ------------
    14 log4j.appender.rolling.DatePattern='.'yyyy-MM-dd
    15 #---------- every month renew ------------
    16 #log4j.appender.rolling.DatePattern='.'yyyy-MM
    17 #---------- every week renew ------------
    18 #log4j.appender.rolling.DatePattern='.'yyyy-MM-ww
    19 #---------- every 12hours renew -------------
    20 #log4j.appender.rolling.DatePattern='.'yyyy-MM-dd-a
    21 #---------- every hour renew --------------
    22 #log4j.appender.rolling.DatePattern='.'yyyy-MM-dd-HH
    23 #---------- every min renew --------------
    24 #log4j.appender.rolling.DatePattern='.'yyyy-MM-dd-HH-mm
    25 log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
    26 log4j.appender.rolling.layout.ConversionPattern=[%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n
    27
    28 ------------------------------------------------------------------
    29
    30 - log4j.rootLogger=INFO, rolling : 로깅레벨을 ‘INFO’로 하고 ‘rolling’이라는 이름의 Appender를 사용한다.
    31 properties파일에는 ConsoleAppender(stdout)DailyRollingFileAppender(rolling)가 정의되어 있습니다.
    32 - log4j.rootLogger=INFO, stdout : console에만 출력
    33 - log4j.rootLogger=INFO, stdout, rolling : consolefile 로 출력 위처럼 설정이 가능합니다.
    34 - log4j.appender.stdout=org.apache.log4j.ConsoleAppender : ConsoleAppender의 이름은 ‘stdout’으로 한다.
    35 - log4j.appender.rolling=org.apache.log4j.DailyRollingFileAppender : DailyRollingFileAppender의 이름은 ‘rollong’으로 한다.
    36 - log4j.appender.rolling.File=/WEB_BACKUP1/pgw_log/webchannel.log : 로그파일의 위치와 파일명을 지정한다.
    37 - log4j.appender.rolling.Append=true : 서버 restart시에도 파일이 reset되지 않는다.
    38 - log4j.appender.rolling.DatePattern='.'yyyy-MM-dd : DatePattern 을 ‘매일갱신’으로 설정. 매일 자정이 지나면 파일명 뒤에 날짜가 붙는다.
    39 ex) webchannel.log.2005-11-21
    40 - log4j.appender.rolling.layout=org.apache.log4j.PatternLayout : layoutPatternLayout으로 설정.
    41 - log4j.appender.rolling.layout.ConversionPattern=[%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n : 로그의 출력 형식을 설정. 아래 설명.
    42
    43 # log4j.appender.rolling.MaxFileSize=500KB : 파일의 최대size 설정하는 부분인데 서버 기동시 최초에 이 부분의 property를 읽지 못했다는 경고가 자꾸 떠서 삭제 했습니다. 설정하지 않으면 Default10MB가 설정된다고 합니다.
    44
    45 # properties 파일의 변경사항은 server restart시에 적용됩니다.
    46
  • XML파일을 이용하는 방법

DatePattern 설정 포맷

줄 번호 보이기/숨기기
   1 '.'yyyy-MM         매달 첫번째날에 로그파일을 변경합니다
2 '.'yyyy-ww 매주의 시작시 로그파일을 변경합니다.
3 '.'yyyy-MM-dd 매일 자정에 로그파일을 변경합니다.
4 '.'yyyy-MM-dd-a 자정과 정오에 로그파일을 변경합니다.
5 '.'yyyy-MM-dd-HH 매 시간의 시작마다 로그파일을 변경합니다.
6 '.'yyyy-MM-dd-HH-mm 매분마다 로그파일을 변경합니다.

PatternLayout 설정 포맷

줄 번호 보이기/숨기기
   1 %p : debug, info, warn, error, fatal 등의 로깅레벨이 출력된다.
2 %m : 로그내용(코드상에서 설정한 내용)이 출력됩니다.
3 ex) logger.info("log"); 라고 코딩했다면 ‘log’가 로그 내용임.
4 %d : 로깅 이벤트가 발생한 시간을 기록합니다. 포맷은 %d{HH:mm:ss, SSS}, %d{yyyy MMM dd HH:mm:ss, SSS} 같은 형태로 사용하며 SimpleDateFormat에 따른 포맷팅을 하면 된다
5 %t : 로그이벤트가 발생된 쓰레드의 이름을 출력합니다.
6 %% : % 표시를 출력하기 위해 사용한다.
7 %n : 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다.
8 %c : 카테고리를 표시합니다.
9 ex) 카테고리가 a.b.c 처럼 되어있다면
10 %c{2}로 설정하면 b.c 가 출력됩니다.
11 %C : 클래스명을 포시합니다.
12 ex) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면
13 %C{2}xyz.SomeClass 가 출력됩니다
14 %F : 로깅이 발생한 프로그램 파일명을 나타냅니다.
15 %l : 로깅이 발생한 caller의 정보를 나타냅니다
16 %L : 로깅이 발생한 caller의 라인수를 나타냅니다
17 %M : 로깅이 발생한 method 이름을 나타냅니다.
18 %r : 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
19 %x : 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
20 %X : 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
21 ex) [%d] %-5p at %C{3}.%M(%13F:%L) %3x - %m%n
22
23 포맷의 각 색깔별로 출력되는 실제 예입니다. 포맷 중간에 원하는 단어(at)나 기호(`.` , `-`)등을 넣으면 그대로 출력됩니다.

Category 별로 따로 따로 log 남기는 방법

  • properties 설정

log4j.rootLogger = DEBUG,stdout,dailyfile
log4j.category.simpleLogger = DEBUG,simple
log4j.category.testLogger = DEBUG,test

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Threshold = DEBUG
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%d{HH:mm:ss}] %p %C{1}:%L %m%n

log4j.appender.dailyfile.Threshold = DEBUG
log4j.appender.dailyfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyfile.File = /weblogic/bea/domains/uccdomain/logs/mh/today/uccmh2.log
log4j.appender.dailyfile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyfile.layout.ConversionPattern=[%d{HH:mm:ss}] %p %C{1}:%L %m%n
log4j.appender.dailyfile.DatePattern='.'yyyy-MM-dd-HH

log4j.appender.simple.Threshold = DEBUG
log4j.appender.simple = org.apache.log4j.DailyRollingFileAppender
log4j.appender.simple.File = logs/simple/Simple.log
log4j.appender.simple.layout = org.apache.log4j.PatternLayout
log4j.appender.simple.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %m%n
log4j.appender.simple.DatePattern='.'yyyy-MM-dd-HH

log4j.appender.test.Threshold = DEBUG
log4j.appender.test = org.apache.log4j.DailyRollingFileAppender
log4j.appender.test.File = logs/test/test.log
log4j.appender.test.layout = org.apache.log4j.PatternLayout
log4j.appender.test.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %m%n
log4j.appender.test.DatePattern='.'yyyy-MM-dd-HH
  • code

// properties의 rootLogger, category.simpleLogger에 설정된 위치에 log가 출력된다.
Logger logSimple = Logger.getLogger("simpleLogger");
logSimple.info("aaaa");

// properties의 rootLogger, category.testLogger에 설정된 위치에 log가 출력된다.
Logger logTest = Logger.getLogger("testLogger");
logTest.info("aaaa");

// 결과적으로 simpleLogger와 testLogger에서 각각 한번 출력했을때 rootLogger에 설정된 log에는 두번의 내용이 출력됨