Adr*_*ian 3 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
错误示例错误消息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");
}
}
Run Code Online (Sandbox Code Playgroud)
Te输出是
文件:log4jtest2.log
$ {FILE_PATTERN} $ {} FILE_PATTERN
任何人都可以解释什么是问题,如何解决?
相关问题:应用程序是否可以访问ResourceBundle以读取要替换的变量?
变量替换是PropertyConfigurator的一个特性,而不是PatternLayout的特征.如果查看代码,则永远不会定义file_pattern应该是什么.但为什么你需要代码中的变量替换?这样做:
PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");
Run Code Online (Sandbox Code Playgroud)
如果你想在其他地方引用该字符串,只需将其设为常量即可.
编辑:您必须读取属性对象,但PropertyConfigurator可以使用属性对象而不是文件,因此您可以加载它,执行您需要执行的操作并将其传递给PropertiesConfigurator,这样您只有一个配置路径.