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 org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.LogLayoutSample;
import egovframework.rte.fdl.logging.util.LogFileUtil;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring/context-common.xml" })
public class LogTargetTest {
// @SuppressWarnings("unchecked")
// @AfterClass
// public static void deleteAllLogFiles() throws InterruptedException {
//
// // 테스트 케이스가 종료할 때 생성한 모든 로그 파일을 삭제함.
// // log4j 에서 로그 파일에 대한 lock 을 잡고 있기 때문에 모든 appender 의 close() 를 실행하여
// resource 해제 필요
// Enumeration<Logger> loggers = LogManager.getCurrentLoggers();
// while (loggers.hasMoreElements()) {
// Logger logger = loggers.nextElement();
// Enumeration<Appender> appenders = logger.getAllAppenders();
// while (appenders.hasMoreElements()) {
// Appender appender = appenders.nextElement();
// appender.close();
// }
// }
//
// // 모든 로그 파일 삭제
// File logDir = new File("./logs");
// for (File tempDir : logDir.listFiles()) {
// for (File tempFile : tempDir.listFiles()) {
// //assertTrue(tempFile.delete());
// tempFile.delete();
// }
// }
// }
@Test
public void testConsoleAppender() throws Exception {
// console 로 설정되어 있는 로거
Log log = LogFactory.getLog("egovframework");
// 로그 기록
log.debug("ConsoleAppender test");
// 하단 콘솔창 확인
}
@Test
public void testFileAppender() throws Exception {
// file 로 설정되어 있는 로거 - ex.)
// egovframework.rte.fdl.logging.sample.LogLayoutSample
Log log = LogFactory.getLog(LogLayoutSample.class);
File logFile = new File("./logs/file/sample.log");
// 로그 기록
log.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"));
}
@Test
public void testRollingFileAppender() throws Exception {
// rollingFile 로 설정되어 있는 로거
Log log = LogFactory.getLog("rollingLogger");
File logFile = new File("./logs/rolling/rollingSample.1.log");
// 로그 기록
log.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"));
//
for (int i = 0; i < 1000; i++) {
log.debug("RollingFileAppender loop : " + i);
}
File logFileDir = new File("./logs/rolling");
// mvn command line 에서 테스트 시는 문제 발생 - MaxFileSize 로 파일 분리가 안되는 경우가 발생
// 프로세스의 파일 접근 관련하여 미묘한 문제가 있어 보임. 1.3alpha-8 의 RollingFileAppender 사용은
// 추천하지 않음.
assertEquals(3, logFileDir.listFiles().length);
for (File tempFile : logFileDir.listFiles()) {
assertTrue(10000 >= tempFile.length());
}
}
@Test
public void testDailyRollingFileAppender() throws Exception {
// dailyRollingFile 로 설정되어 있는 로거
Log log = LogFactory.getLog("dailyLogger");
// 최근 로그는 date pattern 이 들어가 있지 않은 기본 로그파일로 생김
File logFile = new File("./logs/daily/dailyRollingSample.log");
// 로그 기록
log.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"));
// 현재 log4j.xml 에서는 테스트 편의성을 위해 1초 단위로 로그파일을 변경하도록 설정하였으므로
Thread.sleep(1000);
log.debug("DailyRollingFileAppender - file change test");
// 로그파일의 마지막 라인 확인 - 파일이 변경되었더라도 최신 로그는 original 로그 파일명으로 남음
// 예전 로그는 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");
// 백업 파일이 하나 생겼을 것임.
assertTrue(2 <= logFileDir.listFiles().length);
SimpleDateFormat logDatePattern = new SimpleDateFormat("yyyy-MM-dd-HH",
java.util.Locale.getDefault());
// 설정 상 초단위로 나누었지만 백업 파일이 만들어지는 시간인 현재 시각과 초단위의 차이가 있으므로 빼고 비교함
// 마침 백업이 59초에 발생하면 현재 시각과 분 단위가 달라질 수도 있으므로 시간까지만 비교함.
assertTrue(logFileDir.listFiles()[1].getName().contains(
logDatePattern.format(new Date())));
}
}