My log4j.properties contains this 2 appender:
log4j.appender.TEST_SYNC=org.apache.log4j.DailyRollingFileAppender
log4j.appender.TEST_SYNC.DatePattern=.yyyy-MM-dd-HH
log4j.appender.TEST_SYNC.File=test.log
log4j.appender.TEST_SYNC.encoding=UTF-8
log4j.appender.TEST_SYNC.layout=org.apache.log4j.PatternLayout
log4j.appender.TEST=org.com.log.AsyncAppenderHelper
log4j.appender.TEST.appenderFromLogger=TEST_SYNC
I expected that log4j will first register TEST_SYNC and then TEST which using TEST_SYNC appender. When it register vice versa then logging doesnt work. With debug I figure out that log4j use java.util.Properties where order is not guarantee so sometimes my logging doesnt work. How I can guarantee order of registering appenders ?
/*
* This class helps configure to AsyncAppender from log4j as part of log4j.properties
* You can inject other appenders to AsyncAppender using the AsyncAppenderHelper
* This would free up the main program thread to be independent of log4j's logging operation
* @Author http://www.linkedin.com/in/jobypgeorge
*/
public class AsyncAppenderHelper extends AsyncAppender {
public AsyncAppenderHelper() {
super();
}
public void setAppenderFromLogger(String name) {
Logger l = Logger.getLogger(name);
Enumeration<Appender> appenders = l.getAllAppenders();
while (appenders.hasMoreElements()) {
Appender appender = appenders.nextElement();
this.addAppender(appender);
LogLog.debug("Attaching appender named [" + name + "] to appender named [" + appender.getName() + "].");
}
}
}