Log4J http://logging.apache.org/log4j/1.2/index.html似乎有一个恼人的限制——在运行时,变量替换似乎不起作用。
在这个例子中
文件:Log4j.properties
file_pattern=%d{ISO8601} %-5p %m%n
log4j.rootLogger=调试,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=错误
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
${文件模式}${文件模式}
谁能解释一下问题是什么以及如何解决?
相关问题:应用程序可以访问 ResourceBundle 以读取要替换的变量吗?
变量替换的特点是属性配置器 http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PropertyConfigurator.html不是 PatternLayout 的。如果你查看你的代码,你永远不会定义 file_pattern 应该是什么。但为什么需要在代码中进行变量替换呢?只需这样做:
PatternLayout pl = new PatternLayout("%d{ISO8601} %-5p %m%n");
如果您想在其他地方引用该字符串,只需将其设为常量即可。
编辑:您必须读取属性对象,但 PropertyConfigurator 可以采用属性对象而不是文件,因此您可以加载该对象,执行您需要执行的操作并将其传递给 PropertiesConfigurator,因此您只有一个配置路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)