package ddth.dasp.framework.logging.fs; import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.DailyRollingFileAppender; /** * Extends {@link DailyRollingFileAppender} to support file name with place * holders. * * @author NBThanh <btnguyen2k@gmail.com> */ public class PlaceholderDailyRollingFileAppender extends DailyRollingFileAppender { private final static Pattern PATTERN = Pattern.compile("\\$\\{([^\\}]+?)\\}"); /** * Constructs a new LsDailyRollingFileAppender object. */ public PlaceholderDailyRollingFileAppender() { } /** * Substitutes a string. This method Substitutes the supplied string with an * environment variable. * * @param str * String * @return String */ protected static String subtitute(String str) { String[] tokens = str.split("\\s*\\|\\s*"); for (String token : tokens) { String replacement = System.getenv(token); if (replacement != null) { return replacement; } } return str; } /** * Normalizes file name, supports place holders such as ${CATALINA_HOME} * * @param file * String * @return String */ protected String normalizeFile(String file) { if (StringUtils.isBlank(file)) { return ""; } Matcher m = PATTERN.matcher(file); StringBuffer sb = new StringBuffer(); while (m.find()) { String subtitution = subtitute(m.group(1)); m.appendReplacement(sb, Matcher.quoteReplacement(subtitution)); } m.appendTail(sb); // if (LOGGER.isDebugEnabled()) { // LOGGER.debug("Log file: " + sb.toString()); // } return sb.toString(); } /** * {@inheritDoc} */ @Override public void setFile(String file) { super.setFile(normalizeFile(file)); } /** * {@inheritDoc} */ @Override public void setFile(String file, boolean append, boolean bufferedIO, int bufferSize) throws IOException { super.setFile(normalizeFile(file), append, bufferedIO, bufferSize); } }