Log4j 로그파일 동적으로 생성하기
08 Aug 2017Intro
Log4j 1.2.x를 사용할 때 여러 로그파일을 만들 수 있게 하는 클래스이다.
로그파일을 log4j.properties 내에서 정적으로 지정한 것만 사용하는게 불편해서 만들어 보았다.
주의)log4j.properties는 my project/conf 폴더 내에 위치시킨다.
Usage
/** 로그 */
static Logger slogger = LogMgr.getInstance("Serverlog");
static Logger clogger = LogMgr.getInstance("Clientlog");
@Test
public void test() {
slogger.info("SV Message!");
clogger.info("CL Message!");
}
Result
콘솔 결과
로그파일 생성 결과
Code
import java.io.IOException;
import java.util.HashMap;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.DailyRollingFileAppender;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.PropertyConfigurator;
/**
* LogMgr<br>
* <code>org.apache.log4j.Logger</code> properties를 동적으로 관리<br>
*
* @author Choi
*/
public class LogMgr {
/** LOGGER MAP INSTANCE */
private static HashMap<String, Logger> loggerMap;
private LogMgr() {}
/**
* 받은 switchFileName에 해당하는 Logger 인스턴스 반환<br>
* HashMap 인스턴스는 <code>getInstance</code>가 처음 불릴 때 한번 생성되며 (Singleton Ptn)<br>
* pattern이나 log file 이름등 log4j properties 정의 또한 초기에 정해짐<br>
*
* @param switchFileName 동적으로 생성할 로그 파일이름
* @return logger switchFileName에 해당하는 logger 인스턴스 반환
*/
public synchronized static Logger getInstance(String switchFileName) {
if(loggerMap == null)
loggerMap = new HashMap<>();
/** Logger 등록 */
if(!loggerMap.containsKey(switchFileName)) {
// ┌────────────────────────────┐ ┌───────────────────────────────────┐
// │ Ex) /log/default.log │ │ Ex) /log/{switchFileName}.log │
// └────────────────────────────┘ └───────────────────────────────────┘
final String DEFAULT_PATH = "log";
final String DEFAULT_NAME = "default";
final String DEFAULT_EXTENSION = "log";
final String PATTERN = "[%p] " + switchFileName + " %d{yyyy-MM-dd HH:mm:ss}%n\t%m%n";
final String datePattern = ".yyyyMMdd";
/** Logger INSTANCE 얻어옴 */
Logger logger = Logger.getLogger(switchFileName);
/** 기본 log4j.properties 파일의 위치 재정의 */
PropertyConfigurator.configure( "./conf/log4j.properties" );
/** pattern 생성 */
PatternLayout layout = new PatternLayout(PATTERN);
/** log file rename 설정 */
if(switchFileName == null) switchFileName = DEFAULT_NAME;
String fileName = DEFAULT_PATH + "/" + switchFileName + "." + DEFAULT_EXTENSION;
/** console appender 설정 */
ConsoleAppender cAppender = new ConsoleAppender(layout);
logger.addAppender(cAppender);
/** file appender 설정 */
DailyRollingFileAppender fAppender = null;
try {
fAppender = new DailyRollingFileAppender(layout, fileName, datePattern);
} catch (IOException e) {
e.printStackTrace();
}
logger.addAppender(fAppender);
loggerMap.put(switchFileName, logger);
}
return loggerMap.get(switchFileName);
}
}