在log4j xmlconfiguration中使用系统环境variables

是否可以在log4j xmlconfiguration文件中引用系统环境variables(而不是Java系统属性)?

我希望能够做到这样的事情:

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

并从系统环境variables中获得,所以我可以避免使用-Dparameter passing这么多东西。

这个语法只logging在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> 

我最近试图做到这一点,不能得到它的工作。 我最终做的是在启动时发送一个variables。 所以说你有一个名为$ LOG_LEVEL的环境variables:

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

并在启动…

 java -Dlog_level=$LOG_LEVEL your_app 

我认为这不被支持,但基本上你可以做两件事来引入你的环境variables:

  1. 在Log4Jconfiguration之前使用System.setProperty

  2. 将您的环境variables转换为启动器中的系统属性

第一个选项基本归结为:

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

…但问题当然是放在这个代码的地方。 特别是如果你在某种types的Tomcat容器或类似的内部运行,这可能是麻烦的。

另一个很大程度上取决于你的环境。 基本上如果你有一个启动你的应用程序的shell脚本,你可以编写一些shell魔法来设置所有的环境variables为属性,或者只是你需要的那些variables,例如:

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

也可以改变你的服务器启动脚本来支持这个脚本,例如catalina.sh或类似的。

你需要在env和variables的名字之间加上一个冒号,就像这样:

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

创build一个系统variables。 我更喜欢使用setenv.bat这样的variables。

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

在log4j.xml文件中添加引用

 <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>