- Arawn's Dev Blog
- Outsider's Dev Story
- Toby's Epril
- Benelog
- NHN 개발자 블로그
- SK 플래닛 기술 블로그
- OLC CENTER
- 소프트웨어 경영/공학 블로그
- 모바일 컨버전스
- KOSR - Korea Operating System …
- 넥스트리 블로그
- 리버스코어 ReverseCore
- SLiPP
- 개발자를 위하여... (Nextree 임병인 수석)
- "트위터 부트스트랩: 디자이너도 놀라워할 매끈하고 직관…
- Learning English - The English…
- real-english.com
- 'DataScience/Deep Learning' 카테…
- Deep Learning Summer School, M…
- Deep Learning Courses
민서네집
코딩으로 log4j 설정 파일 읽어들여 설정 바꾸기 (PropertyConfigurator 이용) 본문
How to configure log4j with a properties file
http://stackoverflow.com/questions/2288876/how-to-configure-log4j-with-a-properties-file
How to insert current webapp's folder name in log4j filename
Log4j, configuring a Web App to use a relative path
How to configure relative paths for Log4j using Spring
http://www.megadix.it/content/how-configure-relative-paths-log4j-using-spring
log4j 로그 파일의 이름에 Web Context Root의 이름을 넣기 위해 ServletContextListener 를 web.xml 파일에 등록해서 contextInitialized() 메서드에서 configureLog4J() 메서드를 호출했다.
org.apache.log4j.PropertyConfigurator를 이용해서 코드에서 직접 log4j 설정 파일을 읽어들였기 때문에 web.xml 에서 org.springframework.web.util.Log4jConfigListener 를 등록하지는 않았다.
주의할 점은 log4j의 default 설정 파일인 log4j.properties 파일 이름을 그대로 사용하면 System Property 가 적용 안된 상태로 로그 파일이 0 byte 크기로 생성된다. 잘못된 로그 파일이 생성되지 않게 하기 위해서는 log4j 설정 파일의 이름을 default 로 그대로 사용하면 안된다.
configureLog4J() 메서드처럼 복잡하게 안하고
String logPath = System.getenv("TOMCAT_LOG_PATH");
// log4j.properties 에서 사용하기 위해 System Property로 등록해 놓아야 한다.
System.setProperty("TOMCAT_LOG_PATH", logPath);
이렇게 System.setProperty()로 설정만 해도 되는데, 하나의 서버에서 여러 개의 웹어플리케이션이 실행되는 경우
동일한 Property 에 대하여 값을 서로 다르게 설정할 수가 없다.
그래서 아래처럼 log4j 설정 파일을 읽을때 치환해 주는 방식을 쓴 것이다.
나는 동일한 소스로 Context Root 만 다르게 해서 웹어플리케이션을 2개 올리고 있어서 이런 방식을 사용한 것이다.
private boolean configureLog4J(String contextPath) { if( contextPath.length() > 0 ) contextPath = contextPath.substring(1); // Context Root의 맨 앞의 "/"를 제거한다. Properties props = new Properties(); try { Properties webappProps = new Properties(); webappProps.put("context.root", contextPath); if( Global.isDevMode() && !Global.isOpServer()) { // 개발환경에서만 log를 Console에도 출력한다. webappProps.put("optional.appender", ", stdout"); } // log4j.properties(log4j의 default 이름)을 사용하면 ${value} 치환이 안된 상태로 먼저 한번 적용된 log 파일이 생김. // ${value} 값이 없으면 빈 문자열("")로 인식함. InputStream configStream = getClass().getResourceAsStream("/log4j-myapp.properties"); props.load(configStream); configStream.close(); @SuppressWarnings("unchecked") Enumeration<Object> e = (Enumeration<Object>) props.propertyNames(); while (e.hasMoreElements()) { String key = (String) e.nextElement(); // OptionConverter 를 이용한 것과 결과가 같다. /*String property = props.getProperty(key); if( property.indexOf("${context.root}") > -1 ) { property = property.replace("${context.root}", contextName); props.put(key, property); }*/ // used org.apache.log4j.helpers.OptionConverter props.setProperty( key, OptionConverter.substVars(props.getProperty(key), webappProps)); } PropertyConfigurator.configure(props); } catch(IOException e) { System.out.println("FATAL! Cannot load log4j configuration file from classpath."); e.printStackTrace(); return false; } return true; }
log4j-myapp.properties 파일의 내용
log4j.rootLogger = INFO, myapp ${optional.appender} log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %5p {%t} [%c{1}.%M] (%F:%L) - %m%n log4j.appender.stdout.Encoding=UTF-8 log4j.appender.myapp = org.apache.log4j.DailyRollingFileAppender log4j.appender.myapp.file = ${TOMCAT_LOG_PATH}/myapp_${context.root}.log log4j.appender.myapp.datePattern = '.'yyyy-MM-dd log4j.appender.myapp.layout = org.apache.log4j.PatternLayout log4j.appender.myapp.layout.ConversionPattern=%d %5p {%t} [%c{1}.%M] (%F:%L) - %m%n log4j.appender.myapp.Encoding=UTF-8 log4j.logger.org.thymeleaf=WARN log4j.logger.org.thymeleaf.TemplateEngine.CONFIG=WARN log4j.logger.org.thymeleaf.TemplateEngine.TIMER=WARN log4j.logger.org.thymeleaf.TemplateEngine.cache.TEMPLATE_CACHE=WARN log4j.logger.org.thymeleaf.TemplateEngine.cache.FRAGMENT_CACHE=WARN log4j.logger.org.thymeleaf.TemplateEngine.cache.MESSAGE_CACHE=WARN log4j.logger.org.thymeleaf.TemplateEngine.cache.EXPRESSION_CACHE=WARN log4j.logger.thymeleafexamples=DEBUG
'Java' 카테고리의 다른 글
Interface로 다중상속을 대체할 수 있음을 보여주는 예제 (1) | 2015.01.07 |
---|---|
log 내용을 DB에 저장하기 (1) | 2014.12.17 |
Tomcat 7 서버 - hotdeploy 시 memory leak 방지 (0) | 2014.10.10 |
Eclipse Scrapbook page 이용하기 (api 간단 테스트) (0) | 2014.10.01 |
Java 동시성 프로그래밍 (Thread-Safe) (0) | 2014.09.23 |