본문 바로가기

내가 하는일/JAVA

[스크랩] Log4J 사용하기

log4j는 xml과 properties 두개의 설정 파일을 지원하며,
로거 인스턴스는 최초 클래스패스에 있는 log4j.xml을 찾으며, 존재하지 않으면 log4j.properties 파일을
찾게 된다.
여기서는 log4j.properties 파일을 먼저 만들어보고, 이를 다시 log4j.xml로 바꾸어 보았다.
둘중에 무엇을 써도 상관없으나, 보편적으로는 log4j.properties 방식이 많이 쓰이는것 같다.
 

log4j.properties   ( classpath에 위치한다. )


#==========================================================================
# RootLogger
#==========================================================================
# 최상위 루트 로거는 로깅레벨이 DEBUG,
# appender는 stdout, R 두개를 가지고 있다.
log4j.rootLogger=DEBUG, stdout, R

#==========================================================================
# Logger
#==========================================================================
# 새로운 로거의 생성
# 로거 이름은 com.utsman.itexpert 이며 대개 패키지명으로 하게된다.
# com.utsman.itexpert 로 지정하였을 경우 rootLogger 부터 상속하며,
# com, com.utsman, com.utsman.itexpert 의 이름을 가진 로거도 차례로 상속한다.
log4j.logger.com.utsman.itexpert=WARN, X
# 상위 로거를 추가하지 않는다.
log4j.additivity.com.utsman.itexpert=false #==========================================================================
# stdout
#==========================================================================
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

#==========================================================================
# R (RollingFileAppender)
#==========================================================================
# 로깅 레벨 지정
log4j.appender.R.Threshold=INFO
# RollingFileAppender
log4j.appender.R=org.apache.log4j.RollingFileAppender
# 로그 파일이 생성될 위치
log4j.appender.R.File=log/sample.log
# 최대 파일 크기
log4j.appender.R.MaxFileSize=2kb
# 백업 파일 인덱스 갯수
log4j.appender.R.maxBackupIndex=2
# 출력 포맷을 결정할 레이아웃
log4j.appender.R.layout=org.apache.log4j.PatternLayout
# 출력에 사용할 변환 패턴
# d  날짜,
# 5p 로깅 레벨,
# F  파일명,
# L  라인번호,
# m  로그 메시지,
# n  개행문자
log4j.appender.R.layout.ConversionPattern=%d %5p (%F:%L) - %m%n

#==========================================================================
# X (DailyRollingFileAppender)
#==========================================================================
log4j.appender.X=org.apache.log4j.DailyRollingFileAppender
# 로그메세지들이 버퍼되지 않는다.
log4j.appender.X.ImmediateFlush=true
log4j.appender.X.File=log/itexpert.log
# 기존 파일에 로그 메시지를 추가한다.
log4j.appender.X.Append=true
# 파일명에 붙을 꼬리표를 지정
log4j.appender.X.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.X.layout=org.apache.log4j.PatternLayout
# 출력에 사용할 변환 패턴
# r  실행 경과 시간
# t  스레드명
# c  로거이름
log4j.appender.X.layout.ConversionPattern=%r [%t] -%5p %c - %m%n


log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="
http://jakarta.apache.org/log4j/">
 <!--===============================================================================
 stdout
 ================================================================================-->
 <appender name="stdout" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d %5p (%F:%L) - %m%n" />
  </layout>
 </appender>
 <!--===============================================================================
 R
 ================================================================================-->
 <appender name="R" class="org.apache.log4j.RollingFileAppender">  
  <param name="Threshold" value="INFO"/>
  <param name="File" value="log/sample1.log"/>
  <param name="MaxFileSize" value="2KB"/>
  <param name="MaxBackupIndex" value="2"/>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%d %5p (%F:%L) - %m%n"/>
  </layout>
 </appender>
 <!--===============================================================================
 X
 ================================================================================-->  
 <appender name="X" class="org.apache.log4j.DailyRollingFileAppender">
  <param name="ImmediateFlush" value="true"/>
  <param name="File" value="log/itexpert1.log"/>
  <param name="Append" value="true"/>
  <param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm"/>
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%r [%t] -%5p %c - %m%n"/>
  </layout>
 </appender>  
 <!--===============================================================================
 Logger
 ================================================================================-->  
 <logger name="com.utsman.itexpert">
  <level value="WARN" />
  <appender-ref ref="X" />
 </logger>
 <!--===============================================================================
 Root Logger
 ================================================================================-->  
 <root>
  <priority value="DEBUG" />
  <appender-ref ref="stdout" />
  <appender-ref ref="R" />
 </root>
</log4j:configuration>

 

TestLogger.java


package com.utsman.itexpert;

import! org.apache.log4j.Logger;

public class TestApp {
 /**
  * 굳이 static으로 만들어도 의미는 없음. 스태틱이 아니더라도 동일한 logger 인스턴스를 참조한다.
  */
 private static final Logger logger = Logger.getLogger(TestApp.class);
 

 /**
  * @param args
  */
 public static void main(String[] args) {
 
   
   /**
    * 로그의 출력 여부와 상관없이 기본적으로 문자열을 먼저 합하는 비용이 발생하기 때문에,
    * 이를 피하기위한 조건문.
    */
   if (logger.isDebugEnabled()) {
    logger.debug("main(String[]) - 디버그");
   }
   
   if (logger.isInfoEnabled()) {
    logger.info("main(String[]) - 정보");
   }
   
   /**
    * Warn 이상의 레벨에서는 로그의 출력 여부를 미리 계산할 필요가 없을 것 같다.
    */
   logger.warn("main(String[]) - 경고", null);  
   
   logger.error("main(String[]) - 에러", null);  
   if (logger.isEnabledFor(org.apache.log4j.Level.ERROR)) {
    logger.error("main(String[]) - 에러", null);
   }
   logger.fatal("main(String[]) - 치명적에러", null);  
  }
}

출처 : 주영&하준가족
글쓴이 : 주영이아빠 원글보기
메모 : 깔끔한정리~