package egovframework.rte.fdl.logging; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import javax.annotation.Resource; import org.apache.commons.logging.LogFactory; import org.apache.log4j.Appender; import org.apache.log4j.Category; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import egovframework.rte.fdl.logging.sample.LogLevelDebug; import egovframework.rte.fdl.logging.sample.LogLevelError; import egovframework.rte.fdl.logging.sample.LogLevelFatal; import egovframework.rte.fdl.logging.sample.LogLevelInfo; import egovframework.rte.fdl.logging.sample.LogLevelWarn; import egovframework.rte.fdl.logging.sample.LogTestSample; import egovframework.rte.fdl.logging.sample.service.LogTestService; import egovframework.rte.fdl.logging.sample.service.SomeVO; import egovframework.rte.fdl.logging.sample.service.impl.LogTestServiceImpl; import egovframework.rte.fdl.logging.util.LogFileUtil; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath*:META-INF/spring/context-common.xml" }) public class LogLevelTest { @Resource(name = "logTestSample") LogTestSample logTestSample; @Resource(name = "logTestService") LogTestService logTestService; @Resource(name = "logLevelDebug") LogLevelDebug logLevelDebug; @Resource(name = "logLevelInfo") LogLevelInfo logLevelInfo; @Resource(name = "logLevelWarn") LogLevelWarn logLevelWarn; @Resource(name = "logLevelError") LogLevelError logLevelError; @Resource(name = "logLevelFatal") LogLevelFatal logLevelFatal; File logFile; @Before public void onSetUp() throws Exception { // ResourceLoader resourceLoader = new DefaultResourceLoader(); // org.springframework.core.io.Resource resource = // resourceLoader.getResource("file:./logs/file/sample.log"); // logFile = resource.getFile(); logFile = new File("./logs/file/sample.log"); if (!logFile.exists()) { logFile.createNewFile(); } } @Test public void testLogLevel() throws Exception { Logger targetLogger = logTestSample.getTargetLogger(); assertEquals("egovframework.rte.fdl.logging.sample.LogTestSample", targetLogger.getName()); Category selectedCategory = targetLogger; // 대상 클래스 풀패키지명에 매칭되는 정의된 로거(Category)가 없으면 parent 를 따라 설정되므로 // 등록된 Category 는 level 이 정의되 있다는 가정하에 해당 Category 를 찾음 while (selectedCategory.getLevel() == null) { selectedCategory = selectedCategory.getParent(); } assertEquals("egovframework", selectedCategory.getName()); assertTrue(selectedCategory.isDebugEnabled()); assertEquals(Level.DEBUG, selectedCategory.getLevel()); assertTrue(!selectedCategory.getAdditivity()); // 현재 egovframework 로그 레벨이 log4j.xml 에 DEBUG 로 정의되 있으므로 // 해당 로거 정의(Category) 를 따르는 logTestSample 의 메서드를 실행하면 // DEBUG, INFO, WARN, ERROR, FATAL 에 대한 모든 로그가 출력될 것임. console 창에서 확인 logTestSample.executeSomeLogic(); } @Test public void testLogLevelWithIsLevelEnabled() throws Exception { SomeVO vo = new SomeVO(); vo.setSomeAttr("some"); // log4j.xml 에 정의되 있는 데로 "egoveframework" 로거 Category 가 선택되어 DEBUG 레벨의 // console appender 로 출력됨 - console 창에서 확인 logTestService.executeSomeLogic(vo); // logTestService 에 정의되 있는 로거와 같은 로거를 log4j API 를 써서 런타임에 변경해 가며 테스트 Logger targetLogger = Logger.getLogger(LogTestServiceImpl.class); Category selectedCategory = targetLogger; // 대상 클래스 풀패키지명에 매칭되는 정의된 로거(Category)가 없으면 parent 를 따라 설정되므로 // 등록된 Category 는 level 이 정의되 있다는 가정하에 해당 Category 를 찾음 while (selectedCategory.getLevel() == null) { selectedCategory = selectedCategory.getParent(); } // file appender 추가 - file Appender 를 가지고 있는 logger 를 통해 이를 대상 Logger 에 // 적용토록 함. Appender fileAppender = Logger.getLogger( "egovframework.rte.fdl.logging.sample.LogLevelDebug") .getAppender("file"); selectedCategory.addAppender(fileAppender); // log Level 변경 - INFO selectedCategory.setLevel(Level.INFO); logTestService.executeSomeLogic(vo); String[] tailLines = LogFileUtil.getTailLines(logFile, 4); assertTrue(tailLines[0] .endsWith("INFO - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[1] .endsWith("WARN - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[2] .endsWith("ERROR - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[3] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // log Level 변경 - WARN selectedCategory.setLevel(Level.WARN); logTestService.executeSomeLogic(vo); // tail 3 라인 까지만 이번에 변경한 WARN 에 관련된 로깅이지만 이전 데이터 일부를 함께 가져와 새롭게 적용된 내용을 // 명확히 함. tailLines = LogFileUtil.getTailLines(logFile, 4); // 이전 INFO 레벨일 때 마지막 라인 assertTrue(tailLines[0] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // 새로운 WARN 레벨 이후 기록된 라인 - WARN 이상 로그만 나옴 assertTrue(tailLines[1] .endsWith("WARN - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[2] .endsWith("ERROR - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[3] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // log Level 변경 - ERROR selectedCategory.setLevel(Level.ERROR); logTestService.executeSomeLogic(vo); // tail 2 라인 까지만 이번에 변경한 로그 레벨 에 관련된 로깅이지만 이전 데이터 일부를 함께 가져와 새롭게 적용된 내용을 // 명확히 함. tailLines = LogFileUtil.getTailLines(logFile, 4); // 이전 WARN 레벨일 때 마지막 2 라인 assertTrue(tailLines[0] .endsWith("ERROR - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[1] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // 새로운 ERROR 레벨 이후 기록된 라인 - ERROR 이상 로그만 나옴 assertTrue(tailLines[2] .endsWith("ERROR - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[3] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // log Level 변경 - FATAL selectedCategory.setLevel(Level.FATAL); logTestService.executeSomeLogic(vo); // tail 1 라인 까지만 이번에 변경한 로그 레벨 에 관련된 로깅이지만 이전 데이터 일부를 함께 가져와 새롭게 적용된 내용을 // 명확히 함. tailLines = LogFileUtil.getTailLines(logFile, 4); // 이전 ERROR 레벨일 때 마지막 3 라인 assertTrue(tailLines[0] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[1] .endsWith("ERROR - LogTestServiceImpl.executeSomeLogic executed")); assertTrue(tailLines[2] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); // 새로운 FATAL 레벨 이후 기록된 라인 - ERROR 이상 로그만 나옴 assertTrue(tailLines[3] .endsWith("FATAL - LogTestServiceImpl.executeSomeLogic executed")); } @Test public void testLogLevelDebug() throws Exception { logLevelDebug.executeSomeLogic(); LogFactory.getLog("sysoutLogger").debug( "logFile 현재 최종 라인 : " + LogFileUtil.getLastLine(logFile)); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "DEBUG - LogLevelDebug.executeSomeLogic executed")); } @Test public void testLogLevelInfo() throws Exception { logLevelInfo.executeSomeLogic(); LogFactory.getLog("sysoutLogger").debug( "logFile 현재 최종 라인 : " + LogFileUtil.getLastLine(logFile)); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "INFO - LogLevelInfo.executeSomeLogic executed")); } @Test public void testLogLevelWarn() throws Exception { logLevelWarn.executeSomeLogic(); LogFactory.getLog("sysoutLogger").debug( "logFile 현재 최종 라인 : " + LogFileUtil.getLastLine(logFile)); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "WARN - LogLevelWarn.executeSomeLogic executed")); } @Test public void testLogLevelError() throws Exception { logLevelError.executeSomeLogic(); LogFactory.getLog("sysoutLogger").debug( "logFile 현재 최종 라인 : " + LogFileUtil.getLastLine(logFile)); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "ERROR - LogLevelError.executeSomeLogic executed")); } @Test public void testLogLevelFatal() throws Exception { logLevelFatal.executeSomeLogic(); LogFactory.getLog("sysoutLogger").debug( "logFile 현재 최종 라인 : " + LogFileUtil.getLastLine(logFile)); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "FATAL - LogLevelFatal.executeSomeLogic executed")); } }