在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:
-
在Log4Jconfiguration之前使用System.setProperty
-
将您的环境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>