Log4J seems to have an annoying limitation - at run time, variable substitution doesn't work.
In this example
File: Log4j.properties
file_pattern =% d {ISO8601}% -5p% m% n
log4j.rootLogger = DEBUG, FileAppender
log4j.appender.FileAppender = org.apache.log4j.FileAppender log4j.appender.FileAppender.layout = org.apache.log4j.PatternLayout log4j.appender.FileAppender.layout.ConversionPattern = $ {file_pattern} log4j.appender.File = log4jtest1.log
log4j.appender.FileAppender.Threshold = ERROR
The FileAppender file configured in the log4j.properties file produces the correct output:
File: log4jtest1.log
Error message ERROR FATAL Fatal message example
If I try to create FileAppender at runtime
import org.apache.log4j.FileAppender;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
public class Main {
static final Logger logger = Logger.getLogger(Main.class);
public static void main(String[] args) throws Exception {
FileAppender appender = new FileAppender();
appender.setFile("log4test2.log");
PatternLayout pl = new PatternLayout("${file_pattern}");
appender.setLayout(pl);
appender.setName("log4jtest2");
appender.setThreshold(Level.ERROR);
appender.activateOptions();
logger.addAppender(appender);
logger.trace("Sample trace message");
logger.debug("Sample debug message");
logger.info("Sample info message");
logger.warn("Sample warn message");
logger.error("Sample error message");
logger.fatal("Sample fatal message");
}
}
Te output
: log4jtest2.log
${file_pattern} ${file_pattern}
- , , ?
: ResourceBundle, , ?