log4j

Language/JAVA 2013. 8. 29. 14:40

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 관련 프레임웍의 사용이 대두 된다고합니다


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

'Language > JAVA' 카테고리의 다른 글

.getClass() 와 .class의 차이점  (0) 2013.08.29
Log4J 사용 가이드  (0) 2013.08.29
jUnit 으로 Private Method 테스트 만들기  (0) 2013.08.28
Ant - tutorial  (0) 2013.08.26
ANT Build  (0) 2013.08.26
: