'자바'에 해당되는 글 10

  1. 2012.02.03 java] Log4j 사용하기
IT_Expert/Java & Jsp | Posted by 낫기법필 2012. 2. 3. 10:57

java] Log4j 사용하기

쥔장=====================================
java 던 jsp 에서 log를 찍어보기 위해서 Log4j 를 많이 사용하는데
사용만 하지 이에 대한 기본 지식을 잘 알지는 못한다. 하여 이를 습득하기 위해 스크랩한다.
=========================================


1) ================================================

Log는 프로그램을 하다 보면 매우 유용한 정보입니다. 그렇다고 무작정 로그를 남기는 것도 시스템 performance에 악영양을 미치므로 꼭 필요한 부분에 로그를 남겨두는 것이 좋습니다.

 

로그를 남기는 가장 쉬운 방법은 System.out.println("something logs....");와 같이 System.out.println을 사용하면 되지만 프로그램을 개발완료 후에는 불필요한 로그를 삭제하는 작업이 필요하겠죠? 만약 삭제하지 않으면 system log에 엄청난 쓰레기 로그들이 남겠죠? 그러나 이런 로그들이 시스템 오류가 발생했을 때는 매우 귀중한 자원이 됩니다.

 

무작정 삭제할 수도 없고 그렇다고 그대로 놓아두면 시스템 부하가 생기겠죠? 이러한 로그를 잘 관리할 수 있는 뭔가가 필요할 겁니다. 이 문제를 해결하기 위해 나온 것이 log4j 프레임웍이라고 볼 수 있습니다.

 

Log4j에서 로그는 환경파일 설정을 통해 선택적으로 남길 수 있으며, 로그를 남기는 물리적인 매체를 설정할 수도 있습니다. Text file로 남기거나 database로 남기거나 등등..

 

자 그럼 log4j를 한번 사용해 보도록 할까요?

 

Log4j는 다음의 사이트에서 다운로드 받을 수 있습니다. http://logging.apache.org/log4j/1.2/download.html

 

apache-log4j-1.2.16.zip 파일을 다운받으시면 될 것 같네요. 압축을 풀명 여러 파일이 있는데 아래의 log4j-1.2.16.jar파일을 import 시키면 됩니다.


 

 

 

 

다음은 로그를 어떻게 남길지 결정하기 위해 환경설정파일을 만들어야 겠죠? 기본적으로 log4j의 환경파일은 log4j.properties입니다. 또한 기본적인 위치는 WEB-INF\classes directory에 위치시키시면 됩니다. 우선 저는 src 디렉토리에 위치 시켰습니다. 그럼 log4j.properties의 내용을 확인해 볼까요?

 

log4j.rootCategory=DEBUG, console, filelog

 

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

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

log4j.appender.console.layout.ConversionPattern=%-5p,%d{yyyy/MM/ddHH:mm:ss.SSS},%-5X{APP}, %-8X{TSC}, %m %n

 

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender

log4j.appender.filelog.Append=true

log4j.appender.filelog.DatePattern='.'yyyy-MM-dd-HH

log4j.appender.filelog.File=./log/application.log

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

log4j.appender.filelog.layout.ConversionPattern=%-5p,%d{yyyy/MM/ddHH:mm:ss.SSS},%-5X{APP}, %-8X{TSC}, %m %n

 

 

두가지 방법만 일단 알아보겠습니다.  콘솔로 남기는 방법과 파일로 남기는 방법입니다.

 

Log4j 5가지의 로그 레벨이 있습니다. DEBUG, INFO, WARN, ERROR, FATAL 개발자는 로그를 남길 때 이 5가지의 범주로 로그를 남기시면 됩니다. 이는 추후에 알아보기로 하고 환경설정을 하나씩 확인해 보겠습니다.

 

log4j.rootCategory=DEBUG, console, filelog

로그를 남기는 레벨을 지정하고 로그 출력방향을 설정합니다. 위 설정은 DEBUG레벨로 로그를 출력하고 콘솔과 파일로그로 남긴다는 의미입니다. Console, filelog의 이름은 개발자가 마음대로 수정할 수 있습니다.

 console의 환경설정을 볼까요? 로그출력방향을 콘솔로 설정하고 로그 패턴을 설정하고 있습니다.

자세한 사항은 다음의 사이트에서 http://blog.naver.com/gh2501/125766571를 참조하시기 바랍니다.

잘 정리되어 있어요 ^^;

 

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

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

log4j.appender.console.layout.ConversionPattern=%-5p,%d{yyyy/MM/dd HH:mm:ss.SSS},%-5X{APP},%-8X{TSC}, %m %n

 

파일로 로그를 출력합니다.

 

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender

log4j.appender.filelog.Append=true

log4j.appender.filelog.DatePattern='.'yyyy-MM-dd-HH

log4j.appender.filelog.File=./log/application.log

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

log4j.appender.filelog.layout.ConversionPattern=%-5p,%d{yyyy/MM/dd HH:mm:ss.SSS},%-5X{APP},%-8X{TSC}, %m %n

 

자 그러면 이제 로그를 남기도록 설정을 해보도록 하겠습니다. 기존에 테스트하던 소스를 활용해 보겠습니다.

 

package org.power.test;

 

import org.apache.log4j.Logger;

import org.power.dao.BbsDAO;

import org.power.dao.BbsMybatisDAOImpl;

import org.power.vo.BbsVO;

 

import junit.framework.TestCase;

 

public class BbsMybatisDAOImplTest extends TestCase {

 

             private BbsDAO bbsdao;

             public Logger logger;

            

             protected void setUp() throws Exception {

                           super.setUp();

                          

                           bbsdao = new BbsMybatisDAOImpl();

                           logger = Logger.getLogger(this.getClass());

                          

             }

 

             public void testSelect() {

                          

                           BbsVO vo = new BbsVO();                            

                          

                           try {

                                        vo = bbsdao.select(1500);

                                       

logger.debug(vo.toString());

                    logger.info(vo.toString());

                    logger.warn(vo.toString());

                    logger.error(vo.toString());

                    logger.fatal(vo.toString());

                   

                            } catch (Exception e) {                           

                         e.printStackTrace();                 

                            }          

             }

 

 

위의 테스트 코드를 Debug레벨로 로그를 남기고 실행해 보며 다음과 같이 로그가 표시됩니다.

 

 

위를 보면 debug, info, warn, error, fatal의 모든 로그가 표시됩니다. 특히 재미있는 것은 ibatis의 로그도 표시되고 있습니다. , ibatislog4j를 사용하고 있다는 의미겠죠?

 

그럼 레벨을 warn로 해보면 어떻게 될까요? log4j.properties에서 다음의 속성을 바꾸어 보겠습니다.

log4j.rootCategory=WARN, console, filelog

 

 

WARN 레벨 이상의 로그만 표시되고 있습니다.

 

자 개발시에 필요한 DEBUG정보들은 DEBUG로 레벨로 로그를 남기고 실제 운영시에는 로그레벨을 ERROR 레벨로 설정하면 로그가 쌓이는데 소모되는 시스템부하를 줄일 수가 있겠죠? 또한 문제가 발생시에는 로그레벨을 DEBUG로 설정하여 로그를 확인하면 오류를 쉽게 컨트롤 할 수 있을 것이라 봅니다.

 

다만, log4j도 문제가 있습니다. 실제적으로 로그만 출력을 하지 않을 뿐 로그를 만드는 작업,  logger.debug(vo.toString()); 와 같은 코드가 실제적으로 시스템 리소스를 소비하기 때문입니다. String 작업은 java에서 가장 많은 리소스를 차지한다고 합니다. 이런 부하를 해결하기 위해 또 다른 log 관련 프레임웍의 사용이 대두 된다고합니다. 다음에는 slf4j에 대해서 알아봐야 겠습니다.



출처 : http://blog.naver.com/byebird?Redirect=Log&logNo=20140995455
===================================================
===================================================


2)==================================================

Log4J 사용 가이드

 

1. Log4J란 ?

- 자바 프로그램 작성 시 로그를 남기기 위해서 사용되는 Logging Framework

- URL : http://logging.apache.org/log4j/docs/

 

2. Log4J 설치하기( URL : http://logging.apache.org/log4j/docs/download.html )

2.1. 해당 파일 다운 받기

2.1.1. 기본파일

- log4j-1.2.11.jar  : Log4J를 사용하기 위해서 필요한 Jar 파일

  (http://logging.apache.org/log4j/docs/download.html )

2.1.2. 확장파일 ( DataBase 로그파일을 남기기 위한 파일 )

- jdbcappender.jar : JDBCAppender를 사용하기 위한 Jar 파일

- ojdbc14.zip      : Oracle 드라이버 Jar 파일 ( 해당 DBMS에 대한 드라이버파일 )

 

2.2. log4j Configuration 파일 설정하기

2.2.1. Root Logger 설정

log4j.rootLogger=INFO, console, filelog ,dblog

 


- 첫번째는 Log Level을 설정하고 뒤에는 Appender를 설정한다.

- Appender는 상위에 표현되어 있는 것 같이 console(화면출력), filelog(파일), dblog(데이터베이스)로 설정할 수 있으며 Appender에 대한 상세설정은 추후 표기한다. - console, filelog, dblog 등의 명칭은 아래에 설정된 명칭을 사용한다.

- Log Level DEBUG, INFO, WARN, ERROR, FATAL  구성되며, 위와 같이 INFO 설되어 있으면 INFO이하인DEBUG를 제외한 모든 로그가 기록된다.

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

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

log4j.appender.console.layout.ConversionPattern=%-5p,%d{yyyy/MM/dd HH:mm:ss.SSS},%-5X{APP}, %-8X{TSC}, %m %n

 2.2.2. console Appender 설정

 

- 첫번째 라인 : console에 대한 클래스 정의

- 두번째 라인 : 로그를 나타내기 위한 Layout 클래스 정의

세번째 라인 : Layout에 대한 ConversionPattern을 정의

-          

 2.2.3. filelog Appender 설정

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender

log4j.appender.filelog.Append=true

log4j.appender.filelog.DatePattern='.'yyyy-MM-dd-HH

log4j.appender.filelog.File=./log/app.csv

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

log4j.appender.filelog.layout.ConversionPattern=%-5p,%d{yyyy/MM/dd HH:mm:ss.SSS},%-5X{APP}, %-8X{TSC}, %m %n

 

- 첫번째 라인 : filelog에 대한 클래스 정의

- 두번째 라인 : 파일에 대한 Append 여부

- 세번째 라인 : 파일을 Backup하기 위한 DatePattern을 정의

- 네번째 라인 : 로그파일명을 정의

- 다섯째 라인 : 로그를 나타내기 위한 Layout 클래스 정의

- 여섯째 라인 :  Layout에 대한 ConversionPattern을 정의

 

2.2.4. dblog Appender 설정

CREATE TABLE APP_LOG

(

  SYSTEMNAME  VARCHAR2(100 BYTE),

  LOGDATE     TIMESTAMP            DEFAULT SYSDATE,

  LOGLEVEL    VARCHAR2(100 BYTE),

  MDC1        VARCHAR2(100 BYTE),

  MDC2        VARCHAR2(100 BYTE),

  MESSAGE     VARCHAR2(4000 BYTE),

  TROWABLE    VARCHAR2(4000 BYTE)

)


-          DB로그를 작성하기 위해서는 위와 같이 DB Table을 만들어야 한다.

 

 1 Line:log4j.appender.dblog=org.apache.log4j.jdbcplus.JDBCAppender

 2 Line:log4j.appender.dblog.url=jdbc:oracle:thin:@168.219.10.149:1521:MCSDB

 3 Line:log4j.appender.dblog.dbclass=oracle.jdbc.driver.OracleDriver

 4 Line:log4j.appender.dblog.username=sds

 5 Line:log4j.appender.dblog.password=sdsdb

 6 Line:log4j.appender.dblog.sql=INSERT INTO APP_LOG( SYSTEMNAME, LOGDATE, LOGLEVEL, MDC1,MDC2, MESSAGE, TROWABLE ) values ('MCSMGR',TIMESTAMP '@TIMESTAMP@','@PRIO@','@MDC:APP@','@MDC:TSC@','@MSG@','@THROWABLE@')

 7 Line:log4j.appender.dblog.layout=org.apache.log4j.PatternLayout

 8 Line:log4j.appender.dblog.layout.ConversionPattern=%m

 9 Line:log4j.appender.dblog.buffer=1

10 Line:log4j.appender.dblog.commit=true

11 Line:log4j.appender.dblog.quoteReplace=true

12 Line:log4j.appender.dblog.throwableMaxChars=3000

 

- 1 Line : dblog에 대한 클래스 정의

- 2 Line : DB url 정의

- 3 Line : DB 드라이버 클래스 정의

- 4 Line : DB User 정의

- 5 Line : DB Password 정의

- 6 Line : INSERT SQL문 정의

- 7 Line : 로그를 나타내기 위한 Layout 클래스 정의

- 8 Line : Layout에 대한 ConversionPattern을 정의

- 9 Line : DB Update하기 전까지 SQL문의 Buffer 개수. 1이면 바로 Update 

- 10 Line : commit 여부

- 11 Line : single quotes (') 2 single quotes ('')로 변경 여부

- 12 Line : throwable/exception stack trace의 최대 문자 개수 정의

 

 

 2.3. Logging Class 작성하기

import org.apache.log4j.Level;

import org.apache.log4j.Logger;

import org.apache.log4j.MDC;

import org.apache.log4j.PropertyConfigurator;

 

public class Trace

{

        private static Logger McsLogger = Logger.getRootLogger();

        

        public static void log( Level level, String app, String tsc, String message  )

        {

                 log(level,app,tsc,message, null );

        }       

        public static void log( Level level, String app, String tsc, String message,  Throwable t  )

        {

                 if( tsc == null )      tsc = "";

                 if( app == null )      app = "";

                 

                 MDC.put("APP",app);

                 MDC.put("TSC", tsc );

                 McsLogger.log( level, message, t );

                 MDC.remove("APP");

                 MDC.remove("TSC");

        }

        

        public static void main(String args[])

        {

                 String Path = System.getProperty( "user.dir" );

                 

                 PropertyConfigurator.configureAndWatch( Path +"/config/log4j.properties", 1000);

                 

                 System.out.println("URL:"+ Path +"/config/log4j.properties" );

                 

                 Trace.log( Level.INFO, "APP1","TQFRP01","Message01");

                 Trace.log( Level.WARN, "APP2","TQFRP05","Message02");

                 Trace.log( Level.FATAL, "APP3","TQFRP01","Message03", new Exception("Deaded!!"));

                 

                 

                 System.out.println("TEST COMPLETED !!");

        }

}

 

- 위와 같이 시스템별로 로그클랙스를 작성한다.


3. Log4J 적용 예제

3.1. 폴더구조

 

bin    : class 파일

config : log4j.properties

lib     : jdbcappender.jar, log4j-1.2.11.jar, ojdbc14.zip

log    : 로그파일( app.cvs )

src    : 소스파일( Trace.java )

3.2. 실행하기

run.bat  실행


참조-PatternLayout

아래 Conversion Pattern 실제로 Test , 사용하시길 바랍니다.

Conversion

Character

Effect

c

클래스 명

 

 ) %c{2} : "a.b.c"  "b.c".

C

클래스 명

 

) %C{1} : org.apache.xyz.SomeClass  SomeClass

d

날짜 형식

 

 ) %d{dd MMM yyyy HH:mm:ss,SSS} , %d{HH:mm:ss,SSS}

F

파일 명

l

이벤트를 발생시킨 Caller의 위치정보

L

이벤트를 발생시킨 Caller의 라인번호

m

이벤트 메세지

M

이벤트를 발생시킨 Caller 함수명

n

라입구분자

p

로그이벤트 우선순위

r

Application이 시작된 이후, 이벤트가 발생될 때까지 시간( milliseconds )

t

스레드의 이름을 출력

x

NDC(nested diagnostic context)의 사용하기

X

MDC (mapped diagnostic context) 사용하기

 

) %X{clientNumber} : clientNumber Key를 의미함

%

%%는 화면에 %를 출력함

[출처] Log4J 사용 가이드 |작성자 실바




출처 : http://blog.naver.com/gh2501/125766571
====================================================