└ Programming ┐/01. JAVA

2009. 3. 17. 00:25

# Log4J란


 

 

 

# Log4j 환경 설정하는 방법

 

1) 프로그래밍내에서 직접 설정
   - 프로그래밍 내에서 직접 설정  ---------->  1번

 

2) 설정 파일을 사용하는 방법
    - XML 형식                          ---------->   2번
    - 자바의 프로퍼티 형식           ---------->  3번


 

Log4J 설치

아래의 위치에서 파일을 다운로드 받는다.

위치 : http://logging.apache.org/site/binindex.cgi 파일 : jakarta-log4j-1.2.8.zip


원하는 장소에 압축을 풀면 아래와 같은 폴더가 나타난다.


Log4J를 사용하기 위해서는, 클래스 패스에 log4j-1.2.8을 포함해야 한다. 아래의 내용을 확인하면 추가하는 방법을 알 수 있다.

 

 

 

1) 프로그래밍내에서 직접 설정

 

// Log4j에 대한 테스트 소스 (1)

 

import org.apache.log4j.Logger;
import org.apache.log4j.BasicConfigurator;


public class SimpleLog {
 
 // Logger 클래스의 인스턴스를 받아온다.
   static Logger logger = Logger.getLogger(SimpleLog.class);

   public SimpleLog() {}

   public static void main(String[] args) {

   /*
     콘솔로 로그 출력 위한 간단한 설정,
     이 설정이 없다면 경고 메세지가 출력되면서 실행이 중단된다.
      */
    BasicConfigurator.configure();

       logger.debug("[DEBUG] Hello log4j.");
       logger.info ("[INFO]  Hello log4j.");
       logger.warn ("[WARN]  Hello log4j.");
       logger.error("[ERROR] Hello log4j.");
       logger.fatal("[FATAL] Hello log4j.");
       //loger.log( Level.DEBUG , "debug") 와 동일하다.
   }
}

 


# 출력결과 및 설명 

 > 0 [main] DEBUG SimpleLog - [DEBUG] Hello log4j.
    ... (생략)...
 --------------------------------------------------------
 0                             - 로깅호출로부터 경과된 시간 (밀리세컨단위)
 [main]                     - 호출한 스레드의 이름
 DEBUG                    - 로그레벨
 SimpleLog                - 클래스 이름
 [DEBUG]Hello log4j. - 로그메세지
 --------------------------------------------------------

 

# 로그 레벨

로그 레벨은 다음과 같다.
---------------------------------------------------------
DEBUG  : 디버그
INFO     : 정보
WARN   : 경고
ERROR : 에러
FATAL  : 심각한 오류
---------------------------------------------------------
순서는 DEBUG > INFO > WARN > ERROR > FATAL 이며,

log.properties에서 설정한 값 이후의 내역은 모두 기록된다.
즉, INFO로 설정하면, INFO, WARN, ERROR, FATAL의 내용이 로그에 기록된다.



# 중요 컴포넌트 설명 

 1. Logger : 로그의 주체 (로그 파일을 작성하는 클래스)
    - Log4j의 심장부에 위치하며, 개발자가 로그출력 여부를 런타임에 조정되도록 해준다.

      로거는 로그레벨을 가지고 있으며, 로그의 출력여부는 로그문의 레벨과 로거의 레벨을 가지고 결정된다.


    - 어플리케이션을 작성하기전 어떤 로거를 사용해야 할지 정해야 한다.
       ex) static Logger logger = Logger.getLogger(SimpleLog.class);

 

     [참고] Commons-Logging 는 레퍼클래스도 존재함

 


 2. Appender : 로그를 출력하는 위치

     -  로그를 출력하는 위치를 의미하며,

         Log4J API문서의 XXXAppender로 끝나는 클래스들의 이름을 보면, 출력위치를 어느정도 짐작할 수 있다. 

 

 


 3. Layout : Appender의 출력포맷
 
    -  일자, 시간, 클래스명등 여러가지 정보를 선택하여 로그정보내용으로 지정할 수 있다.

        자세한 패턴은 아래의 클래스정보를 살펴보면 알수있다. 
        http://logging.apache.org/log4j/docs/api/org/apache/log4j/PatternLayout.html

 

 

    ※ Layout의 종류

 

        1) DateLayout,
        2) HTMLLayout,
        3) PatternLayout, ( 일반적으로 PatternLayout을 사용하는 것이 디버깅에 가장 적합함 )
        4) SimpleLayout,
        5) XMLLayout 

 

 


패턴 레이아웃 설명

ex) "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n
------------------------------------------------------------------------------------------------------------
C : 클래스명을 출력한다. {1}과 같은 설정을 추가하여 클래스 이름 또는 특정 패키지 이상만 출력하도록 설정할 수 있다.
d : 로그 시간을 출력한다. java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있다.
F : 파일 이름을 출력한다. 로그시 수행한 메소드, 라인번호가 함께 출력된다.
L : 라인 번호만 출력한다.
m : 로그로 전달된 메시지를 출력한다.
M : 로그를 수행한 메소드명을 출력한다.
n : 줄 바꿈
p : 로그 이벤트명 (DEBUG등)
r : 로그 처리시간 (milliseconds)

------------------------------------------------------------------------------------------------------------

 

 

 

 

// Log4j에 대한 테스트 소스 (2)

 

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.");
  }
}


---------- java ----------
출력 완료 (1초 경과) - 정상 종료
DailyLog.log 파일을 열어보면 아래와 같은 내용이 추가된것을 알 수 있다.

[2004-07-29 17:36:05] DEBUG [DailyLog.main(DailyLog.java:30)] - Hello log4j.


파일의 내용은 소스 코드에서 정의된 패턴인 "[%d{yyyy-MM-dd HH:mm:ss}] %-5p [%l] - %m%n" 에 따라 생성된 것이다.

 

출력된 것과 대조해보면 대충 어떤 의미인지 유추가 가능하다.

-----------------------------------------------------------------------------------------

1번째 : 날짜  (날짜를 나타내는 형태도 SimpleDateFormat 을 사용하는 것처럼 원하는 형태로 가능)

2번째 : 로그 레벨

3번째 : [패키지 이름.클래스 이름.메소드 이름(소스 파일 이름:소스 라인 넘버)] 

4번째 : 실제 로그 내용

-----------------------------------------------------------------------------------------

(출력 패턴은 이외에도 많은 것들이 있는데 자세한 사항은 log4j API 문서를 참고하도록 하자.)
     

 

 

 

 

2) 설정 파일을 사용하는 방법 (1) - 자바 프로퍼티 형식

 

 

# properties 파일 사용하는 법 (자바의 프로퍼티 형식)

 

애플리케이션에서 각 클래스는 각각의 로거를 가지거나 공통의 로거를 가질 수 있다.

Log4j는 모든 로거가 상속할 수 있는 루트 로거를 제공한다.

log4j.properties를 만들때도 맨 위에 필요한 것이 루트로거에 대한 내용이다.

#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


아래 문서는 log를 출력할 자바문서이다.

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

public class LogProperty {
  
  static Logger logger = Logger.getLogger(LogProperty.class);
  
  public static void main(String[] args) {
    logger.debug("Hello log4j.");
  }
}
실행
---------- java ----------
출력 완료 (1초 경과) - 정상 종료


화면에 출력되는 로그는 없다. 아래와 같이 변경한 후 다시 LogProperty를 실행한다.

 

log4j.rootLogger=DEBUG, A1
#log4j.rootLogger=OFF, A1


아래와 같이 결과가 나타날 것이다.

---------- java ----------
[2004-07-29 18:10:33] - Hello log4j.
출력 완료 (3초 경과) - 정상 종료



또 다른 예를 들어보자. log4j.properties 를 아래와 같이 수정한다.

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


LogProperty.java 문서를 다시 실행하면 같은 폴더에 test.log 파일이 생성된다. test.log파일을 열어본다.

 

 

------------------------------------------------------------
Log4j의 초기화 (log4j.properties 파일을 이용한 초기화)
------------------------------------------------------------

초기화를 위한 첫번째 방법은 필요한 로깅 요소를 포함하는 log4j.properties 파일을 만들어 이를 통해 초기화 하는 것입니다. 아래 예는 INFO 레벨로 oef.apache.log4j.ConsoleAppender를 사용하여 콘솔에 메시지를 출력하는 설정 파일 입니다.
[Log4j.properties]

# A basic log4j configuration file that creates a single
console appender
# Create a single console appender that logs INFO and higher
log4j.rootLogger=INFO, stdout
# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
# Configure the stdout appender to use the PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's filename and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

이 설정은 하나의 Appender 즉 System.out으로만 메시지를 출력하는 ConsoleAppender를 사용 합니다.

log4j.properties 파일은 WEB-INF/classes 폴더에 설치해야 하며 다중 애플리케이션 환경일 경우 각 애플리케이션 별로 log4j.properties를 설치 할 수 있습니다.

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

[Log4j.properties]

# A sample log4j configuration file
# Create two appenders, one called stdout and the other called rolling
log4j.rootLogger=DEBUG, stdout, rolling

# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# Configure the stdout appender to use the PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's filename and line number
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L)- %m%n

# Configure the rolling appender to be a RollingFileAppender
log4j.appender.rolling=org.apache.log4j.RollingFileAppender

# Configure the name of the logout for the rolling appender
log4j.appender.rolling.File=output.log

# Set up the maximum size of the rolling log file
log4j.appender.rolling.MaxFileSize=100KB

# Keep one backup file of the rolling appender
log4j.appender.rolling.MaxBackupIndex=1

# Configure the layout pattern and conversion pattern for the rolling appender
log4j.appender.rolling.layout=org.apache.log4j.PatternLayout
log4j.appender.rolling.layout.ConversionPattern=%d{ABSOLUTE} - %p %c - %m%n

 

 

 

3) 설정 파일을 사용하는 방법 (2) - XML 형식

 

 

# XML로 log4j 사용하는 법

 

------------------------------------------------------------
Log4j의 초기화 (XML 파일을 이용한 초기화)
------------------------------------------------------------


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

Log4j.configuration 파일에서 프로퍼티를 설정 하는 방법은 다음과 같습니다.

set CATALINA_OPTS=-Dlog4j.configuration=log4j.xml

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

java -Dlog4j.configuration=log4j.xml


[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="stdout"
class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%5p [%t] (%F:%L)- %m%n"/>
</layout>
</appender>
<root>
<priority value ="INFO" />
<appender-ref ref="stdout" />
</root>
</log4j:configuration>


참고로 log4j.xml 파일의 위치를 /WEB-INF/class 에서 상대적으로 지정하지 않고 파일 시스템의 절대 경로를 사용 하기 위해서는 다음과 같이 합니다.

java -Dlog4j.configuration=file:/c:/dev/env/log4j.xml

 

<<소스-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>

 

 

 

 

<<소스-Properties>>
# A sample log4j configuration file

# Create two appenders, one called stdout and the other called rolling
log4j.rootCategory=INFO, stdout

log4j.debug=false


# Configure the stdout appender to go to the console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender

# Configure the stdout appender to use the PatternLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's filename and line number
log4j.appender.stdout.layout.ConversionPattern=%5p,[%d],[%t],(%F:%L),%m%n

#-Dlog4j.configuration="file:D:\myworkspace\FrameWorkTest\src\log4j.properties --------Eclipse Connection

 

 

참고문헌

- http://jakarta.apache-korea.org/log4j/documentation.html

- http://blog.naver.com/owlish/80004419128

- 모델 2로 다시 배우는 JSP [한빛미디어]

   [2004-07-29 18:17:35] DEBUG [LogProperty.main(LogProperty.java:16)] - Hello log4j.