java - Log4J – 运行时变量替换

标签 java variables log4j substitution

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

在这个例子中

文件: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.FileAppender.File=log4jtest1.log

log4j.appender.FileAppender.Threshold=ERROR

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

文件:log4jtest1.log

ERROR Sample error message FATAL Sample fatal message

如果我尝试在运行时创建一个 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");
    }
}

输出是

文件:log4jtest2.log

${file_pattern}${file_pattern}

谁能解释一下问题是什么以及如何解决?

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

最佳答案

变量替换是 PropertyConfigurator 的一个特性不是 PatternLayout。如果您查看您的代码,您永远不会定义 file_pattern 应该是什么。但是为什么需要在代码中进行变量替换呢?只需这样做:

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

如果您想在其他地方引用该字符串,只需将其设为常量即可。

编辑:您将不得不读取属性对象,但是 PropertyConfigurator 可以获取一个属性对象而不是一个文件,因此您可以加载它,做您需要做的并将它传递给 PropertiesConfigurator,所以您只有一个配置路径。

关于java - Log4J – 运行时变量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1783365/

相关文章:

java - log4j - 为什么我的 appender 不显示消息?

java - 运行时 boolean 值发生变化

java - 如何在 Java Springboot 中使用 jdbcTemplate 将整数数组插入到 postgresql 表中?

JavaFX GridPane 自动调整大小

c++ - 晚声明变量是不是更有效率?

java - 使用变量来存储值还是直接从对象中获取值?

java - 如何在 JavaFX 中将一个简单的双矩阵绘制到 TableView 中?

Python:局部变量神秘地更新全局变量

java - 将 log4j 2.10.0 与 Java 9 System.Logger 一起使用

java - 我使用什么日志系统?