2008-10-14 59 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

相关问题