관리 메뉴

아이짱구

Log4J 설치 및 사용법 본문

development/apache

Log4J 설치 및 사용법

아이짱구 2008. 5. 27. 17:38
Log4j는 한번의 로깅을 호출함으로 로그메세지를 콘솔, 텍스트파일, html 파일, xml 파일, 소켓이나 심지어는 Windosws NT Event Log, 이메일 등으로 전송 할수 있다. 오픈 소스 프로젝트인 Log4j는 개발자들이 매우 손쉽고 다양한 형태로 로깅을 할 수 있도록 도와줍니다. 성능 또한 우수해 더이상 System.out.println을 사용하지 말자구 하네요.

http://logging.apache.org/log4j/1.2/publications.html 에 가보면 여러 Articles 이 있다.
다른 내용보단 영문이라도 쫄지말구 함 가서 보면 별거 아니다. 정 힘들다면.. 그곳에 있는 Sample source는 볼수 있을 것이다.


1.Log4j의 중요 컴포넌트

 a. Logger(Category) : 로그 파일을 작성하는 클래스이고, Appender 에 메세지를 전달하는기능
 b. Appender : 로그를 출력하는 위치
    Log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 짐작할 수 있다.
   
http://logging.apache.org/log4j/docs/api/index.html
    ex) ConsoleAppender,FileAppender.....
 c. Layout : Appender의 출력, Appender로 로그를 생성하기 전에 메세지 형식을 만드는 클래스.
    ex) DateLayout, HTMLLayout, PatternLayout,SimpleLayout, XMLLayout 

ex) SAMPLE SOURCE

import java.io.IOException;

import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;

public class DailyLog {
 
  static Logger logger = Logger.getLogger(DailyLog.class);
 
  public static void main(String[] args) {
    String pattern = "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n";
    PatternLayout layout = new PatternLayout(pattern);
   
    // 처음 생성될 로그 파일의 이름
    String filename = "DailyLog.log";
   
    // 날짜 패턴에 따라 추가될 파일 이름
    String datePattern = ".yyyy-MM-dd";
   
    DailyRollingFileAppender appender = null;
    try {
      appender = new DailyRollingFileAppender(layout, filename, datePattern);
    } catch (IOException ioe) {
      ioe.printStackTrace();
    }
   
    logger.addAppender(appender);
   
    logger.debug("Hello log4j.");
  }
}

2. Log4j.properties 설정

Log4j 를 설정하는 기본파일은 log4j.properties 이네요~ log4j.properties를 만들어 /WEB-INF/classes 밑에 놓으면 되구,Log4j를 설정하는 것은 Category(logger)에 Appender (목적지/대상/핸들러)를 더하고 각각의 Appender 에게 Layout(구성)을 저정하는 것이다.

애플리케이션에서 각 클래스는 각각의 로거를 가지거나 공통의 로거를 가질 수 있다.
Log4j는 모든 로거가 상속할 수 있는 루트 로거를 제공한다.
log4j.properties를 만들때도 맨 위에 필요한 것이 루트로거에 대한 내용이다.

Ex) 로깅 레벨
DEDUG < INFO < WARN < ERROR < FATAL

Ex) 표현식
%m: 로그내용이 출력
%p: debug, info, warn, error, fatal 등의 priority 출력
%r: 어플리케이션이 시작되어 로깅이벤트가 발생하는 시점까지의 경과시간을 밀리세컨드로 출력
%c: 예) 카테고리가 a.b.c 처럼 되어있다면 %c{2}는 b.c가 출력됩니다.
%n:  플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다
%d: 로깅이벤트가 일어나 날짜 출력 ( 프로그램의 실행속도를 느리게 한다.)
        예) %d{HH:mm:ss} 또는 %d{dd MMMM yyyy HH:mm:ss}
%C: 호출자의 클래스명 출력
        예) 클래스구조가 org.apache.xyz.SomeClass 처럼 되어있다면 %C{2}는 xyz.SomeClass 가 출력됩니다
%M: 로깅이 발생한 method 이름을 나타냅니다.
%F: 로깅이 발생한 프로그램 파일명을 나타냅니다.
%l: 로깅이 발생한 caller의 정보를 나타냅니다
%L: 로깅이 발생한 caller의 라인수를 나타냅니다
%x: 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다.
%X: 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다.
%%: % 표시를 출력하기 위해 사용한다. 
%t: 로그이벤트가 발생된 쓰레드의 이름을 출력합니다

다음 포맷으로 출력해본다면

ex) [%c] [%C] [%d] [%F] [%l] [%L] [%m] [%M] [%n] [%p] [%r] [%t]

[test.jsp] [org.apache.jsp.test_jsp] [2005-03-10 12:37:23,561] [test_jsp.java] [org.apache.jsp.test_jsp._jspService(test_jsp.java:64)] [64] [fatal!!] [_jspService] [개행] [FATAL] [765567] [http-8080-Processor25]

Ex)Appender  Sample properties
=> ConsoleAppender 옵션
Threadhole=WARN : category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.

ImmediateFlush=true: 기본값은 true 로그메세지가 버퍼되지 않는다.
Target=System.err: 기본값은 System.out

log4j.rootLogger=DEBUG, A1
#log4j.rootLogger=OFF, A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] - %m%n

=> FileAppender 옵션
Threadhole=WARN: category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true: 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt: 로깅할 파일명
Append=false: 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.

=> RollingFileAppender 옵션
Threadhole=WARN: category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true: 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt: 로깅할 파일명
Append=false: 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
MaxFileSize=100KB: KB, MB, GB 의 단위를 사용, 지정한 크기에 도달하면 로그파일을 교체한다.
MaxBackupIndex=5: 최대 5개의 백업 파일을 유지한다.

=> DailyRollingFileAppend 옵션
Threadhole=WARN: category 의 priority가 더 낮게 지정되어 있더라도 여기 명시된 priority 보다 낮은 메세지들은 로깅하지 않는다.
ImmediateFlush=true: 기본값은 true 로그메세지가 버퍼되지 않는다.
File=testlog.txt: 로깅할 파일명
Append=false: 기본값은 true이며, 파일끝에 추가하는 것을 의미한다.
DatePattern='.'yyyy-mm: 매월 파일을 교체한다. 교체주기는 월, 주, 일, 시간, 분 별로 정할 수 있다.

log4j.rootLogger=DEBUG, A1
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=test.log
log4j.appender.A1.DatePattern='.'yyyy-mm-dd
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n


Ex) Jdbc Sample properties


log4j.appender.R=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.R.URL=jdbc:mysql://localhost/LOG4JDemo
log4j.appender.R.user=default
log4j.appender.R.password=default
log4j.appender.R.sql=INSERT INTO JDBCTEST (Message) VALUES ('%d - %c - %p - %m')

ex) 아래의 log4j.properties 파일은 메시지의 레벨과 다른 파라미터들을 기반으로 하여 여러 Appender에 로그 메시지를 기록하도록 설정 하는 예 입니다. 콘솔에도 출력하고 out.log 파일에도 메시지를 출력 합니다.

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, rolling 두개를 정의
log4j.rootLogger=DEBUG, stdout, rolling

# stdout 어펜더는 콘솔에 뿌리겠다는 정의
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# stdout 어펜더는 patternlayout을 사용하겠다는 정의
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# 페턴은 다음과 같이 포맷팅 하겠다는 것을 정의
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# rolling 어펜더는 파일로 처리한다라고 정의
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# 로그 파일 이름은 output.log
log4j.appender.rolling.File=output.log

# 파일 최대 사이즈는 100KB로 설정
log4j.appender.rolling.MaxFileSize=100KB

# rolling 어펜더는 1개의 백업파일을 유지하겠데요~
log4j.appender.rolling.MaxBackupIndex=1

# rolling 어펜더는 패턴 레이아웃을 사용하겠다고 정의, 패턴 레이아웃 포맷
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n


3 XML 파일을 이용해 세팅

Log4j.properties 처럼 XML 파일 역시 WEB-INF/classes 폴더에 위치하면 됩니다. 그리고 파일이름은 반드시 log4j.configuration 시스템 프로퍼티에 지정하여 어떤 파일을 로딩 할것인지를 알게 해야 합니다.

Log4j.configuration 파일에서 프로퍼티를 설정 하는 방법은 다음과 같습니다.
set CATALINA_OPTS=-Dlog4j.configuration=log4j.xml

또는 자바 명령행에서 지정하는 것도 가능 합니다.

java -Dlog4j.configuration=log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- 콘솔로 보기(디버그) -->
    <appender name="CONSOLE-debug" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%p - %C{1}  :  %M  %m %n"/>
        </layout>
    </appender>
   
    <!-- 콘솔로 보기(인포) -->
    <appender name="CONSOLE-info" class="org.apache.log4j.ConsoleAppender">
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%m ---%d %n"/>
        </layout>
    </appender>
   
    <!-- 매 날짜별 로그 파일 남기기 -->
    <appender name="LOGFILE-DAILY" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(로그인) -->
    <appender name="LOGFILE-DAILY-LOGIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-login.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(가입) -->
    <appender name="LOGFILE-DAILY-JOIN" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-join.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
     <!-- 매 날짜별 로그 파일 남기기(탈퇴) -->
    <appender name="LOGFILE-DAILY-JOINBREAK" class="org.apache.log4j.DailyRollingFileAppender">
        <param name="file" value="test-daily-joinbreak.log"/>
        <param name="Append" value="true"/>
        <param name="DatePattern" value="'.'yyyy-MM-dd"/>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d - %m%n"/>
        </layout>
    </appender>
   
    <!-- 로그 파일 100KB마다 새로 남기기 -->
    <appender name="LOGFILE-SIZE" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="test-Size.log"/>
        <param name="Append" value="true"/>
        <param name="MaxFileSize" value="100KB"/>

       <param name="MaxBackupIndex" value="5"/>  
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d %-5p [%t] %-17c{2} (%13F:%L) %3x - %m%n"/>
        </layout>
    </appender>
   
    <!-- XML 형태로 로그 파일 남기기 -->
    <appender name="LOGFILE-XML" class="org.apache.log4j.FileAppender">
        <param name="file" value="test-XML.log"/>
        <param name="Append" value="true"/>
        <layout class="org.apache.log4j.xml.XMLLayout"/>
    </appender>

    <logger name="org.apache">
        <level value="WARN"/>
    </logger>
   
    <root>
        <level value="INFO"/>
        <appender-ref ref="CONSOLE-debug"/>
       
        <!--<appender-ref ref="LOGFILE-DAILY"/>-->
        <!--<appender-ref ref="LOGFILE-SIZE"/>-->
        <!--<appender-ref ref="CONSOLE-info"/>-->
        <!--<appender-ref ref="LOGFILE-XML"/>-->
    </root>
</log4j:configuration>


Posted by 워리어
다른 분의 글을 당겨오는 기능을 몰라서 이렇게 카피 페스트 했습니다. 궁극에는 제 블로그 폰트에 맞추어 관리하고자 그랬습니다. 양해 바랍니다.
다른 사람 글 엮기에 대해 알려 주실분... ^^;
Comments