2012-10-25 72 views
30

我有一個log4j.xml配置文件。以及我需要提供用於存儲日誌的文件路徑的RollingFileAppender。問題是我的代碼將作爲可運行的jar部署在Unix機器上。所以,如果我傳遞的參數是這樣的:如何在log4j配置文件中爲文件appender提供環境變量路徑

value=logs/messages.log" 

它創建我的家目錄內的文件夾名爲日誌和寫入所有消息記錄到該目錄中的文件。

我有一個環境變量設置爲某個值。我想使用該變量的路徑並在該路徑下寫入消息。我怎樣才能實現它?

我一直在使用這種嘗試:

value="${MY_HOME}/logs/message.log" 

但這不起作用。任何人都可以提出這個問題的解決方案?

+0

我懷疑它只是用你的hom e目錄作爲基礎,因爲這是Java進程的當前工作目錄... –

回答

38

當解析其配置文件,表達式${MY_HOME}將擴展到系統屬性的值MY_HOME,而不是系統環境變量。兩者之間有區別。

要在乾淨的方式做到這一點,你必須像這樣添加到JVM調用行:

-DMY_HOME=$MY_HOME

這將定義Java系統屬性MY_HOME包含的價值環境變量MY_HOME

+0

謝謝你的回覆。您能否告訴我如何將上述語句添加到JVM調用行。 –

+0

您剛纔提到您的代碼是作爲可運行的JAR部署在Unix機器上的。你的Unix機器上有一個調用JAR文件的shell腳本(或類似的東西)(使用'java -jar myapp.jar',加上參數);只需在該行添加「-DMY_HOME = $ MY_HOME」即可。 – Isaac

+1

哦,好的。謝謝@Isaac的幫助。所以這意味着我不需要對我的XML文件進行任何更改:以下是代碼:

-1

由於您使用的是unix,因此您可以使用這樣的路徑。

/home/Production/modulename/logs/message.log 

路徑應以/

+1

但OP希望使用環境變量來控制路徑。 – rolve

0

也許開始... ...:

datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz 
layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n 

# infoFile 
log4j.appender.infoFile=org.apache.log4j.RollingFileAppender 
log4j.appender.infoFile.File=${MY_HOME}/logs/message.log 
log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout 
log4j.appender.infoFile.layout.ConversionPattern=${layout} 
+0

這將是屬性文件的代碼。 $ {MY_HOME} /logs/message.log也適用於XML文件。因爲我曾嘗試過使用XML文件使用類似的東西,但沒有奏效。 –

-1

動態改變一個變量,你可以做這樣的事情:

String value = System.getenv("MY_HOME"); 
Properties prop = new Properties("log4j.properties"); 
prop.put("MY_HOME", value); // overwrite with value from environment 
PropertyConfigurator.configure(prop); 
+0

這是爲我的配置文件。這將工作,沒有問題。但我想要的是將$ MY_HOME路徑追加到文件appender路徑,我用這個路徑記錄XML配置文件中的消息。 –

+0

請問在這種情況下,我可以如何將「MY_HOME」變量傳遞到我的Java應用程序中。此刻,我有以下一段代碼「System.out.println(」System MY_HOME:「+ System.getenv(」MY_HOME「));」但是,當我嘗試從Eclipse傳遞「MY_HOME」 - >運行配置 - >參數 - >程序參數:-DMY_HOME = $ MY_HOME時,最終打印出「System MY_HOME:null」 – user454083

+0

新屬性(字符串)不甚至存在?!那麼這可能有什麼幫助? – Philipp

23

你可以給它環境變量。只是preppend ENV:變量名之前,像這樣:

value="${env:MY_HOME}/logs/message.log" 
+10

這是爲log4j 2.X.不適用於1.2.17 ... – vikingsteve

+0

考慮到您使用Log4j2而不是第一個版本,這是最終的答案。謝謝! – russellhoff

+0

這是我的作品...謝謝@Inari –

2

java -DLOG_DIR=${LOG_DIR} -jar myjar.jar "param1" "param2" ==>在CMD行,如果你有 「價值=」 $ {} LOG_DIR /log/clientProject/project-error.log」在XML

4

我得到了這個工作。

  1. 在我的log4j.properties。我指定

log4j.appender.file.File = $ {LOGFILEPATH}

  • 在蝕 - JVM參數
  • -DLogFilePath = C:\ work \ MyLogFile.log

    相關問題