티스토리 뷰

Studying/Web Application

Log4j 정리

hongkyu 2012. 10. 10. 08:17

1.  특징

1.1.       주요 기능 

     Log for Java라는 뜻으로 Jakarta-project에서 Java를 위한 프로젝트 중 하나로 처음부터 Java의 예외를 처리하기 위해 설계되었다.

     속도와 유연성을 고려하여 디자인되었으며, 속도에 최적화 되었다.

     계층적인 로그 설정과 처리를 지원한다.

     Thread-Safe 하여 멀티스레드 환경에서 사용해도 안전하다.

     로그 처리 관련 설정을 프로그램에서 API를 이용하여 직접 구현해도 되고, properties 파일이나 XML 파일을 이용하여 추가 설정 파일을 이용할 수도 있다.

     출력을 파일, 콘솔, java.io.OutputStream, java.io.Writer, TCP를 사용하는 원격서버, 원격 Unix Syslog 데몬, 원격 JMS 구독자, 윈도우NT EventLog로 보낼 수 있고, 심지어는 e-mail 로 보낼 수도 있다.

     계층적인 6가지의 로그 메시지 레벨을 사용한다. (TRACE, DEBUG, INFO, WARN, ERROR, FATAL.)

     국제화를 지원한다.

 

1.2.       동작 특성

 

1)      Log4j의 구조

     Logger(Category) : Log4J 에서 지원하는 핵심 클래스로서, 로깅이 일어나는 부분을 그룹화해, 필요한 그룹의 로그만을 출력하거나, 카테고리에 우선순위를 부여함으로써, 여러가지 출력 방법을 지원한다. 실제 로그 기능을 수행하는 역할을 담당한다.

     Appender : 로그의 출력 위치를 지정한다. Appender로 설정 가능한 출력은 콘솔, 파일, OutputStream, java.io.Writer, Email(SMTP), Network 등이 있다.

-       ConsoleAppender : 콘솔에 로그 메시지를 출력한다.

-       FileAppender : 파일에 로그 메시지를 출력한다.

-       RollingFileAppender : 로그의 크기가 지정한 용량 이상이 되면 다른 이름의 파일을 출력한다.

-       DailyRollingFileAppender : 하루를 단위로 로그 메시지를 파일에 출력한다.

-       SMTPAppender : 로그 메시지를 이메일로 보낸다.

-       NTEventLogAppender : 윈도우의 이벤트 로그 시스템에 기록한다.

     Layout : 로그의 출력 포맷을 지정한다. 단순한 텍스트 출력, 포맷을 직접 지정한 패턴, HTML 문서 형식 등을 사용할 수 있다.

-       %d : 로그의 기록시간을 출력한다.

-       %p : 로깅의 레벨을 출력한다.

-       %F : 로깅이 발생한 프로그램의 파일명을 출력한다.

-       %M : 로깅이 발생한 메소드의 이름을 출력한다.

-       %l : 로깅이 발생한 호출지의 정보를 출력한다.

-       %L : 로깅이 발생한 호출지의 라인수를 출력한다.

-       %t : 로깅이 발생한 Thread명을 출력한다.

-       %c : 로깅이 발생한 카테고리를 출력한다.

-       %C : 로깅이 발생한 클래스명을 출력한다.

-       %m : 로그 메시지를 출력한다.

-       %n : 개행 문자를 출력한다.

-       %% : %를 출력

-       %r : 어플리케이션이 시작 이후부터 로깅이 발생한 시점까지의 시간을 출력한다.(ms)

-       %x : 로깅이 발생한 Thread와 관련된 NDC(nested diagnostic context)를 출력한다.

-       %X : 로깅이 발생한 Thread와 관련된 MDC(mapped diagnostic context)를 출력한다.

 

2)      Log4j의 로깅 레벨 (지정한 것 이상의 레벨메시지가 출력)

     FATAL : 가장 크리티컬한 에러가 일어 났을 때 사용한다.

     ERROR : 일반 에러가 일어 났을 때 사용한다.

     WARN : 에러는 아니지만 주의할 필요가 있을 때 사용한다.

     INFO : 일반 정보를 나타낼 때 사용한다.

     DEBUG : 일반 정보를 상세히 나타낼 때 사용한다.

     TRACE : 경로추적을 위해 사용한다.

 

1.3.       /단점

 

1)      장점

     프로그램의 문제 파악이 용이하다. (Problem diagnosis: No matter how well written our code is, there may be some problems hidden in it. As soon as the triggering conditions occur, the hidden problems come to the surface. If our applications have well-written code for logging the internal state of the system, we will be able to detect the problems precisely and quickly.)

     빠른 디버깅 가능하다. (Quick debugging: Once we diagnose the problem, we know exactly how to solve the problem. The logging trace should be aimed at showing the precise location of the problem, which means we will be able to debug the application in less time. Well-planned and well-written logging code greatly reduces the overall cost of debugging the application.)

     로그 파악이 쉽다. (Easy maintenance: Applications with a good logging feature are easy to debug and therefore easy to maintain compared to any application without a similar logging feature. The logging information typically contains more information than the debugging trace.)

     로그 이력을 파일, DB등으로 남길 수 있다. (History: A good logging feature in an application results in logging information being preserved in a structured way at a desired location. The location may be a file, database, or remote machine. All this enables system administrators to retrieve the logging information at a future date by going through the logging history.)

     효율적으로 디버깅이 가능하다. (Cost and time savings: As explained, well-written logging code offers quick debugging, easy maintenance, and structured storage of an application’s runtime information. This makes installation, day-to-day maintenance, and debugging much more cost- and time-effective.)

 

2)      단점

     로그에 대한 디바이스(파일) 입출력으로 인해 런타임 오버헤드가 발생한다. (Logging adds runtime overhead due to the generation of logging information and the device Input/Output (I/O) related to publishing logging information.)

     로깅을 위한 추가 코드로 인해 전체 코드 사이즈가 증가한다. (Logging adds programming overhead due to the extra code required for producing logging information. The logging process increases the size of the code.)

     심하게 생성되는 로그는 혼란을 일으킬 수 있다. (Badly produced logging information can cause confusion.)

     심하게 생성되는 로그는 어플리케이션 성능에 영향을 미칠 수 있다. (Badly written logging code can seriously affect the application’s performance.)

     개발 중간에 로깅 코드를 추가하기 어렵다. (Last but not least, logging requires planning ahead, as adding logging code at a late stage of development is difficult.)


 

2. 예제

2.1.       로그 설정

 

1)      예제 조건

     "root" 로그는 console appender로 설정.

     "framework" 로그는 file appender로 설정.

     "business" 로그는 rolling file appender로 설정하며, rolling 주기는 "매일".

 

2)      log4j.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>

   

    <appender name="console" class="org.apache.log4j.ConsoleAppender">

        <param name="target" value="System.err"/>

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

    <appender name="filedest" class="org.apache.log4j.FileAppender">

        <param name="file" value="./logs/file.log"/>

        <layout class="org.apache.log4j.PatternLayout">

                 <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

    <appender name="rollingdest" class="org.apache.log4j.DailyRollingFileAppender">

        <param name="File" value="./logs/rolling.log" />

        <param name="Append" value="true" />

        <param name="DatePattern" value="'.'yyyyMMdd" />

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

 

    <logger name="framework" additivity="false">

        <level value="DEBUG"/>

        <appender-ref ref="filedest" />

    </logger>

    <logger name="business" additivity="false">

        <level value="DEBUG"/>

        <appender-ref ref="rollingdest" />

    </logger>   

    <root>

        <level value="DEBUG" />

        <appender-ref ref="console" />

    </root>

   

</log4j:configuration>

 

 

3)      log4j.properties

 

log4j.rootLogger=debug,console

 

log4j.logger.framework=debug,filedest

log4j.additivity.framework=false

 

log4j.logger.business=debug,rollingdest

log4j.additivity.business=false

 

log4j.appender.console=org.apache.log4j.ConsoleAppender

log4j.appender.console.target=System.err

log4j.appender.console.layout=org.apache.log4j.PatternLayout

log4j.appender.console.layout.conversionPattern=%d %5p [%c] %m%n

 

log4j.appender.filedest = org.apache.log4j.FileAppender

log4j.appender.filedest.File=./logs/file.log

log4j.appender.filedest.layout=org.apache.log4j.PatternLayout

log4j.appender.filedest.layout.conversionPattern=%d %5p [%c] %m%n

 

log4j.appender.rollingdest = org.apache.log4j.DailyRollingFileAppender

log4j.appender.rollingdest.File=./logs/rolling.log

log4j.appender.rollingdest.Append=true

log4j.appender.rollingdest.DatePattern='.' yyyyMMdd

log4j.appender.rollingdest.layout=org.apache.log4j.PatternLayout

log4j.appender.rollingdest.layout.conversionPattern=%d %5p [%c] %m%n

 

 

2.2.       로그 레벨 변경

 

1)      예제 조건

     log4j.xml을 복사하여 log4j@P.xml를 작성하여 각 로그의 로그 레벨을 변경한다.

     기 작성된 log4j.xml은 개발용이며, 신규 작성된 log4j@P.xml은 운영용이다.

 

2)      Log4j@P.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration>

   

    <appender name="console" class="org.apache.log4j.ConsoleAppender">

        <param name="target" value="System.err"/>

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

    <appender name="filedest" class="org.apache.log4j.FileAppender">

        <param name="file" value="./logs/file.log"/>

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

    <appender name="rollingdest" class="org.apache.log4j.DailyRollingFileAppender">

        <param name="File" value="./logs/rolling.log" />

        <param name="Append" value="true" />

        <param name="DatePattern" value="'.'yyyyMMdd" />

        <layout class="org.apache.log4j.PatternLayout">

            <param name="ConversionPattern" value="%d %5p [%c] %m%n" />

        </layout>

    </appender>

 

    <logger name="framework" additivity="false">

        <level value="ERROR"/>

        <appender-ref ref="filedest" />

    </logger>

    <logger name="business" additivity="false">

        <level value="ERROR"/>

        <appender-ref ref="rollingdest" />

    </logger>   

    <root>

        <level value="ERROR" />

        <appender-ref ref="console" />

    </root>

   

</log4j:configuration>

 

 

2.3.       선택적으로 초기화 방법과 설정파일

 

1)      에제 조건

     작성된 두 개의 설정파일을 JVM옵션을 사용하여 선택적으로 초기화 가능하다.

     선택적으로 초기화 하는 방법과 설정파일을 작성하시오.

 

2)      선택적으로 초기화 방법

     “log4j.xml” 선택 JVM 옵션 : -Dlog4j.configuration=log4j.xml

     “log4j@P.xml” 선택 JVM 옵션 : -Dlog4j.configuration=log4j@P.xml

     Eclipse에서는 Run Configurations Arguments – VM arguments 에 지정하여 사용

 

2.4.       로그 사용 소스

 

1)      예제 조건

     설정 파일 log4j.xml에 설정을 사용하여 각각의 로그를 기록하는 java 파일을 1개로 작성.

     클래스명은 LoggingTest1 사용.

 

2)      LoggingTest1 소스

 

import org.apache.log4j.Logger;

import org.apache.log4j.PropertyConfigurator;

 

public class LoggingTest1 {

      

       public static void main(String[] args) {

 

             PropertyConfigurator.configure("./bin/log4j.xml");

            

             Logger loggerConsole = Logger.getLogger("LoggingTest1");

             Logger loggerFile = Logger.getLogger("framework");

             Logger loggerRolling = Logger.getLogger("business");

            

             loggerConsole.debug("ConsoleAppender");

             loggerFile.debug("FileAppender");

             loggerRolling.debug("DailyRollingFileAppender");

       }

}

 


반응형

'Studying > Web Application' 카테고리의 다른 글

XML Parser 정리  (0) 2012.10.10
DB Connection 정리  (0) 2012.10.10
Apache Commons Logging  (0) 2012.10.10
JSP 정리  (0) 2011.04.10
[JSP] 내장 객체의 범위  (0) 2011.04.08
댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday