Log4J - Runtime Variable Substitution

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, , ?

+3
2

- PropertyConfigurator, PatternLayout. , , _. ? :

 PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");

, .

: , PropertyConfigurator , , , , PropertyConfigurator, .

+7

:

Properties props = new Properties();
InputStream fis = new FileInputStream(new File("/somewhere/log4j.properties")); 
props.load(fis);
fis.close();
PatternLayout layout = new PatternLayout(props.getProperty("file_pattern"));
+1

Source: https://habr.com/ru/post/1723667/


All Articles