是否可以在log4j xml配置文件中引用系統環境變量(而不是Java系統屬性)?在log4j xml配置中使用系統環境變量
我希望能夠做這樣的事情:
<level value="${env.LOG_LEVEL}" />
,並讓它得到從系統環境變量,這樣我就可以避免與-D參數這麼多東西來傳遞。
是否可以在log4j xml配置文件中引用系統環境變量(而不是Java系統屬性)?在log4j xml配置中使用系統環境變量
我希望能夠做這樣的事情:
<level value="${env.LOG_LEVEL}" />
,並讓它得到從系統環境變量,這樣我就可以避免與-D參數這麼多東西來傳遞。
此語法記錄只在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>
我最近試圖做到這一點,但無法使其正常工作。我最終做的是在啓動時發送一個變量。所以說,你有一個名爲$ LOG_LEVEL的環境變量:
<level value="${log_level}" />
,並在啓動時...
java -Dlog_level=$LOG_LEVEL your_app
我特別提出瞭如何做到這一點*不需要將它們全部設置爲-D參數,所以這根本不回答我的問題。 – 2015-09-30 20:46:18
我認爲這是不支持的,但基本上你可以做兩件事情在您的環境帶來變量:
使用Log4j之前System.setProperty被配置
轉換(你的)環境變量系統屬性在你的發射
第一個選項基本上可以歸結爲這樣:
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或類似的。
你需要把env和變量名之間有一個冒號,就像這樣:
<level value="${env:LOG_LEVEL}" />
創建一個系統變量。我更喜歡使用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>
您在那裏顯示的語法$ {APP_LOG_ROOTDIR}是否查看系統環境變量,而不僅僅是Java系統屬性?我的理解(和經驗)一直只看Java系統屬性,而不是環境變量。 – 2016-02-04 00:43:51
我剛剛談到了最upvoted回答,並解釋我的推理。我也剛剛提出了我接受的答案,因爲它值得。 – 2015-09-30 20:46:59