是否可以在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