package egovframework.rte.fdl.logging; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.File; import java.text.SimpleDateFormat; import java.util.Date; import egovframework.rte.fdl.logging.sample.LogLayoutSample; import egovframework.rte.fdl.logging.util.LogFileUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.junit.Test; public class LogTargetTest { /** * 아래는 ConsoleAppender를 테스트하는 메소드 egovframework Logger: level=DEBUG, * appender=Console * */ @Test public void testConsoleAppender() throws Exception { Logger logger = LogManager.getLogger("egovframework"); // 로그 출력 logger.debug("ConsoleAppender test"); // 하단 Console에서 로그 확인 } /** * 아래는 FileAppender를 테스트하는 메소드 logger: level=DEBUG, appender=File * */ @Test public void testFileAppender() throws Exception { Logger logger = LogManager.getLogger(LogLayoutSample.class.getName()); File logFile = new File("./logs/file/sample.log"); // 로그 출력 logger.debug("FileAppender test"); // 로그파일의 마지막 라인 확인 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()); assertTrue(LogFileUtil.getLastLine(logFile).contains( sdf.format(new Date()))); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "FileAppender test")); } /** * 아래는 RollingFileAppender를 테스트하는 메소드 logger: level=DEBUG, * appender=RollingFile, fileName=./logs/rolling/rollingSample.log * */ @Test public void testRollingFileAppender() throws Exception { Logger logger = LogManager.getLogger("rollingLogger"); File logFile = new File("./logs/rolling/rollingSample.log"); // 로그 출력 logger.debug("RollingFileAppender test"); // 로그파일의 마지막 라인 확인 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()); assertTrue(LogFileUtil.getLastLine(logFile).contains( sdf.format(new Date()))); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "RollingFileAppender test")); // RollingFile Appender 설정에 append=true(default)가 설정되어 있으므로 // 다음 로깅 시에는 target파일을 clear하지 않고 로깅된다. for (int i = 0; i < 1000; i++) { logger.debug("RollingFileAppender loop : " + i); } // DefaultRolloverStrategy 설정에서 fileIndex를 "min(default 1)"으로 지정하였으므로 // targetFile의 size가 1000Byte를 넘어가면 fileIndex가 1인 파일에 rolling됨 // 생성된 파일 수를 확인해보자 File logFileDir = new File("./logs/rolling"); // DefaultRolloverStrategy 설정에서 생성가능한 파일 수(max)를 3으로 지정하였기에 // target 파일을 포함하여 총 4개의 파일이 생성됨 assertEquals(4, logFileDir.listFiles().length); for (File tempFile : logFileDir.listFiles()) { assertTrue(10000 >= tempFile.length()); } } /** * 아래는 DailyRollingFileAppender를 테스트하는 메소드 logger: level=DEBUG, * appender=RollingFile, fileName=./logs/daily/dailyRollingSample.log * */ @Test public void testDailyRollingFileAppender() throws Exception { Logger logger = LogManager.getLogger("dailyLogger"); // 최근 로그는 date pattern 이 들어가 있지 않은 기본 로그파일로 생김 (target파일) File logFile = new File("./logs/daily/dailyRollingSample.log"); // 로그 출력 logger.debug("DailyRollingFileAppender test"); // 로그파일의 마지막 라인 확인 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", java.util.Locale.getDefault()); assertTrue(LogFileUtil.getLastLine(logFile).contains( sdf.format(new Date()))); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "DailyRollingFileAppender test")); // history파일을 만들어보자 // 현재 log4j2.xml 에서는 테스트 편의성을 위해 1초 단위로 로그파일을 변경하도록 설정하였으므로 // dailyRollingSample.log 에 있는 로그가 아래 로그를 찍으면서 // datePattern에 따라 dailyRollingSample.log.날짜로 변경됨 --> history 파일 생성 Thread.sleep(1000); // 아래 최신 로그는 target파일에 출력됨 logger.debug("DailyRollingFileAppender - file change test"); // target파일의 마지막 라인 확인 // 예전 로그는 date pattern 이 포함된 이전 로그 파일의 백업에서 확인할 것 assertTrue(LogFileUtil.getLastLine(logFile).contains( sdf.format(new Date()))); assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "DailyRollingFileAppender - file change test")); // 생성된 파일 수를 확인해보자 File logFileDir = new File("./logs/daily"); // 최초 실행 시 최소 파일 2개 생성 assertTrue(2 <= logFileDir.listFiles().length); SimpleDateFormat logDatePattern = new SimpleDateFormat("yyyy-MM-dd-HH", java.util.Locale.getDefault()); // 설정 상 초단위로 나누었지만 백업 파일이 만들어지는 시간인 현재 시각과 초단위의 차이가 있으므로 시간까지만 비교함 // 예를 들어 백업이 59초에 발생하면 현재 시각과 분 단위가 달라질 수도 있으므로 시간까지만 비교함 // 테스트 케이스가 실패하는 이유는 위의 경우에 해당하므로 ./logs/daily에 모든 파일을 삭제한 후 다시 테스트한다. assertTrue(logFileDir.listFiles()[1].getName().contains( logDatePattern.format(new Date()))); } }