log4j
Language/JAVA 2013. 8. 29. 14:40Log는 프로그램을 하다 보면 매우 유용한 정보입니다. 그렇다고 무작정 로그를 남기는 것도 시스템 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의 로그도 표시되고 있습니다. 즉, ibatis도log4j를 사용하고 있다는 의미겠죠?
그럼 레벨을 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 |