2009-11-23 69 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"));