민서네집

코딩으로 log4j 설정 파일 읽어들여 설정 바꾸기 (PropertyConfigurator 이용) 본문

Java

코딩으로 log4j 설정 파일 읽어들여 설정 바꾸기 (PropertyConfigurator 이용)

브라이언7 2014. 12. 11. 16:46

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


Comments