2008-10-14 56 views
40

是否可以在log4j xml配置文件中引用系統環境變量(而不是Java系統屬性)?在log4j xml配置中使用系統環境變量

我希望能夠做這樣的事情:

<level value="${env.LOG_LEVEL}" /> 

,並讓它得到從系統環境變量,這樣我就可以避免與-D參數這麼多東西來傳遞。

+0

我剛剛談到了最upvoted回答,並解釋我的推理。我也剛剛提出了我接受的答案,因爲它值得。 – 2015-09-30 20:46:59

回答

12

此語法記錄只在log4j的2.X,以便確保您使用的是正確的版本。它不適用於1.X版本。

<Appenders> 
    <File name="file" fileName="${env:LOG_PATH}"> 
     <PatternLayout> 
      <Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern> 
     </PatternLayout> 
    </File> 
</Appenders> 
46

我最近試圖做到這一點,但無法使其正常工作。我最終做的是在啓動時發送一個變量。所以說,你有一個名爲$ LOG_LEVEL的環境變量:

<level value="${log_level}" /> 

,並在啓動時...

java -Dlog_level=$LOG_LEVEL your_app 
+0

我特別提出瞭如何做到這一點*不需要將它們全部設置爲-D參數,所以這根本不回答我的問題。 – 2015-09-30 20:46:18

11

我認爲這是不支持的,但基本上你可以做兩件事情在您的環境帶來變量:

  1. 使用Log4j之前System.setProperty被配置

  2. 轉換(你的)環境變量系統屬性在你的發射

第一個選項基本上可以歸結爲這樣:

for (Map<String,String>.Entry entry : System.getenv().entrySet()) { 
    System.setProperty(entry.getKey(), entry.getValue()); 
} 

...但問題當然是從哪裏把這個代碼。特別是如果你在某種類型的Tomcat容器或類似內部運行,這可能會很麻煩。

另一個主要取決於你的環境。基本上,如果你有啓動您的應用程序shell腳本,你可以寫一些外殼魔術設置所有環境變量作爲屬性,或者只是那些你需要,如:

java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main 

它也可以改變你的服務器啓動腳本來支持這個,例如catalina.sh或類似的。

2

你需要把env和變量名之間有一個冒號,就像這樣:

<level value="${env:LOG_LEVEL}" /> 
0

創建一個系統變量。我更喜歡使用setenv.bat來處理這些變量。在文件的log4j.xml

@echo off 
rem app specific log dir 
set "APP_LOG_ROOTDIR=../app/app-log" 
exit /b 0 

添加引用

<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"> 
    <param name="Threshold" value="DEBUG" /> 
    <param name="MaxFileSize" value="512KB" /> 
    <param name="MaxBackupIndex" value="10" /> 
    <param name="File" value="${APP_LOG_ROOTDIR}/app.log"/> 
    <layout class="org.apache.log4j.PatternLayout"> 
    <param name="ConversionPattern" value="%d %-5p %c{1} %m %n" /> 
    </layout> 
</appender> 
+0

您在那裏顯示的語法$ {APP_LOG_ROOTDIR}是否查看系統環境變量,而不僅僅是Java系統屬性?我的理解(和經驗)一直只看Java系統屬性,而不是環境變量。 – 2016-02-04 00:43:51

相關問題