Java Log4J–;运行时变量替换

Java Log4J–;运行时变量替换,java,variables,log4j,substitution,Java,Variables,Log4j,Substitution,似乎有一个恼人的限制——在运行时,变量替换似乎不起作用 在这个例子中 文件:Log4j.properties 文件模式=%d{ISO8601}%-5p%m%n log4j.rootLogger=DEBUG,FileAppender log4j.appender.FileAppender=org.apache.log4j.FileAppender log4j.appender.FileAppender.layout=org.apache.log4j.patternalyout log4j.appe

似乎有一个恼人的限制——在运行时,变量替换似乎不起作用

在这个例子中

文件:Log4j.properties

文件模式=%d{ISO8601}%-5p%m%n

log4j.rootLogger=DEBUG,FileAppender

log4j.appender.FileAppender=org.apache.log4j.FileAppender log4j.appender.FileAppender.layout=org.apache.log4j.patternalyout log4j.appender.FileAppender.layout.ConversionPattern=${file_pattern} log4j.appender.FileAppender.File=log4jtest1.log

log4j.appender.FileAppender.Threshold=错误

log4j.properties文件中配置的FileAppender生成正确的输出:

文件:log4jtest1.log

错误示例错误消息 致命示例致命消息

如果我试图在运行时创建FileAppender

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输出为

文件:log4jtest2.log

${file\u pattern}${file\u pattern}

谁能解释一下问题是什么,如何解决


相关问题:应用程序是否可以访问ResourceBundle以读取要替换的变量?

变量替换是PatternLayout的一项功能。如果您查看代码,就永远不会定义文件模式应该是什么。但为什么在代码中需要变量替换呢?只要这样做:

 PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");
如果要在其他地方引用该字符串,只需将其设置为常量即可


编辑:您必须读取properties对象,但PropertyConfiguration可以将properties对象改为文件,这样您就可以加载该对象,执行所需操作并将其传递给PropertiesConfiguration,这样您只有一个配置路径。

您可以手动加载它:

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"));

嗯,是的,这将是一个简单的解决办法,但不幸的是,这是不可接受的。看起来我只需要直接读取log4j.properties文件(例如,使用properties类)并“手动”应用运行时file_模式变量的值variable file_模式在log4j.properties文件中定义您不能使用${file_模式}引用属性文件之外的属性文件中的值。在代码中,您需要使用java变量。检查Log4j是否公开了它的属性,如果公开了,您将不需要自己读取该文件。如果不是,那么你是正确的:属性类。据我所知,属性对象没有公开。