package egovframework.rte.fdl.logging; import static org.junit.Assert.assertTrue; import java.io.File; import egovframework.rte.fdl.logging.sample.LogLayoutSample; 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.util.LogFileUtil; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.ThreadContext; 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; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath*:META-INF/spring/context-common.xml" }) public class LoggerMatchingTest { File logFile; @Before public void onSetUp() throws Exception { logFile = new File("./logs/file/sample.log"); if (!logFile.exists()) { logFile.createNewFile(); } } /** * 아래는 log4j2.xml에 정의된 Logger name과 자바코드에서 호출하는 Logger Name 일치여부를 테스트하는 메소드 * Root Logger: level=TRACE, appender=Console * egovframework Logger: level=DEBUG, appender=Console * testClassLog: level=DEBUG, appender=Console * logTestSampleLog: level=DEBUG, appender=Console * layoutSampleLog: level=DEBUG, appender=File * logLevelDebugLog: level=DEBUG, appender=File * mdcLogger: level=DEBUG, appender=File * */ @Test public void testLoggerMatching() throws Exception { // Logger testClassLog = LogManager.getLogger("egovframework.rte.fdl.logging.LoggerMatchingTest"); 과 동일 // log4j2.xml에는 "egovframework.rte.fdl.logging.LoggerMatchingTest" 이름의 Logger가 존재하지 않으므로 // Named Hierarchy에 따라 이름이 가장 많이 매칭되는 "egovframework" 이름의 Logger설정을 따른다. Logger testClassLog = LogManager.getLogger(LoggerMatchingTest.class.getName()); // 로그 출력 testClassLog.debug("logger - egovframework"); // 하단 Console에서 로그 확인 // Logger layoutSampleLog = LogManager.getLogger("egovframework.rte.fdl.logging.sample.LogLayoutSample"); 과 동일 // log4j2.xml에는 "egovframework.rte.fdl.logging.sample.LogLayoutSample" 이름의 Logger가 존재하므로 해당 Logger 설정을 따른다. Logger layoutSampleLog = LogManager.getLogger(LogLayoutSample.class.getName()); // 로그 출력 layoutSampleLog.debug("logger - egovframework.rte.fdl.logging.sample.LogLayoutSample"); // 로그 확인 assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "logger - egovframework.rte.fdl.logging.sample.LogLayoutSample")); // Logger logLevelDebugLog = LogManager.getLogger("egovframework.rte.fdl.logging.sample.LogLevelDebug"); 과 동일 // log4j2.xml에는 "egovframework.rte.fdl.logging.sample.LogLevelDebug" 이름의 Logger가 존재하므로 해당 Logger 설정을 따른다. Logger logLevelDebugLog = LogManager.getLogger(LogLevelDebug.class.getName()); // 로그 출력 logLevelDebugLog .debug("logger - egovframework.rte.fdl.logging.sample.LogLevelDebug"); // 로그 확인 assertTrue(LogFileUtil.getLastLine(logFile).endsWith( "logger - egovframework.rte.fdl.logging.sample.LogLevelDebug")); // 이하 유사 Logger logLevelInfoLog = LogManager.getLogger(LogLevelInfo.class.getName()); Logger logLevelWarnLog = LogManager.getLogger(LogLevelWarn.class.getName()); Logger logLevelErrorLog = LogManager.getLogger(LogLevelError.class.getName()); Logger logLevelFatalLog = LogManager.getLogger(LogLevelFatal.class.getName()); // 로그 출력 logLevelInfoLog .info("logger - egovframework.rte.fdl.logging.sample.LogLevelInfo"); logLevelWarnLog.warn("logger - egovframework.rte.fdl.logging.sample.LogLevelWarn"); logLevelErrorLog.error("logger - egovframework.rte.fdl.logging.sample.LogLevelError"); logLevelFatalLog.fatal("logger - egovframework.rte.fdl.logging.sample.LogLevelFatal"); // 로그 확인 String[] tailLines = LogFileUtil.getTailLines(logFile, 4); assertTrue(tailLines[0].endsWith("logger - egovframework.rte.fdl.logging.sample.LogLevelInfo")); assertTrue(tailLines[1].endsWith("logger - egovframework.rte.fdl.logging.sample.LogLevelWarn")); assertTrue(tailLines[2].endsWith("logger - egovframework.rte.fdl.logging.sample.LogLevelError")); assertTrue(tailLines[3].endsWith("logger - egovframework.rte.fdl.logging.sample.LogLevelFatal")); // Logger LogTestSample = LogManager.getLogger("egovframework.rte.fdl.logging.sample.LogTestSample"); 과 동일 // log4j2.xml에는 "egovframework.rte.fdl.logging.sample.LogTestSample" 이름의 Logger가 존재하지 않으므로 // Named Hierarchy에 따라 이름이 가장 많이 매칭되는 "egovframework" 이름의 Logger설정을 따른다. Logger logTestSampleLog = LogManager.getLogger(LogTestSample.class.getName()); // 로그 출력 logTestSampleLog.debug("logger - egovframework"); // 하단 console에서 로그 확인 // 직접 Logger Name ("mdcLogger")을 지정하여 Logger 객체 획득 // log4j2.xml에 "mdcLogger" 이름의 Logger 설정이 있음 Logger mdcLogger = LogManager.getLogger("mdcLogger"); ThreadContext.put("class", this.getClass().getSimpleName()); ThreadContext.put("method", "testLogMDC"); ThreadContext.put("testKey", "test value"); // 로그 출력 pattern: %d %5p [%c] [%X{class} %X{method} %X{testKey}] %m%n mdcLogger.debug("MDC test!"); // 로그 확인 File mdcFile = new File("./logs/file/mdcSample.log"); assertTrue(LogFileUtil.getLastLine(mdcFile) .endsWith("DEBUG [mdcLogger] [LoggerMatchingTest testLogMDC test value] MDC test!")); // 존재하지 않는 로거명을 지정하는 경우, Root Logger에 걸림 Logger notExistLog = LogManager.getLogger("notExistLogger"); // 로그 출력 // Root Logger의 level이 error일 경우, debug("DEBUG - logger - egovframework");는 출력되지 않음 notExistLog.debug("DEBUG - logger - egovframework"); notExistLog.error("ERROR - logger - egovframework"); // 하단 console에서 로그 확인 } }