Log4J – 运行时变量替换

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

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

如果我尝试在运行时创建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_PATTERN} $ {} FILE_PATTERN

任何人都可以解释什么是问题,如何解决?

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

变量替换是PropertyConfigurator的一个特性,而不是PatternLayout的特征。 如果查看代码,则永远不要定义file_pattern应该是什么。 但为什么你需要代码中的变量替换? 这样做:

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

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

编辑:您必须读取属性对象,但PropertyConfigurator可以使用属性对象而不是文件,因此您可以加载它,执行您需要执行的操作并将其传递给PropertiesConfigurator,这样您只有一个配置路径。

您可以手动加载它:

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