2009-11-23 32 views
3

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

在这个例子中

文件:Log4j.properties

FILE_PATTERN =%d {ISO8601}%-5p%米%正

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

特输出

文件:log4jtest2.log

$ {FILE_PATTERN} $ {} FILE_PATTERN

任何人都可以解释什么是问题,怎么可以它是固定的?

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

回答

7

变量替换是PropertyConfigurator而不是PatternLayout的一个特性。如果你看看你的代码,你永远不会定义什么样的file_pattern。但为什么你需要代码中的变量替换?只需执行以下操作:

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

如果要在其他位置引用该字符串,只需将其设为常量即可。

编辑:您将必须读取属性对象,但PropertyConfigurator可以将一个属性对象替换为一个文件,因此您可以加载该对象,执行您需要执行的操作并将其传递给PropertiesConfigurator,因此您只需要一个配置路径。

+0

嗯,是的,它会是一个简单的解决办法,但不幸的是不能接受的。看来我只需要阅读log4j。属性文件(例如使用Properties类)并在运行时“手动”应用file_pattern变量的值 – Adrian

+1

变量file_pattern在Log4j.properties文件中定义 – Adrian

+0

您不能使用$ {file_pattern}从属性文件中引用值在属性文件之外。在代码中你需要使用java变量。检查Log4j是否公开其属性,如果它确实存在,则不需要自己读取该文件。如果没有,那么你是正确的:属性类。 –

1

您可以手动加载:

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