是否可以在log4j xml配置文件中引用系统环境变量(而不是Java系统属性)?

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

<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

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

  1. 在配置Log4J之前使用System.setProperty

  2. 将(您的)环境变量转换为启动器中的系统属性

  3. 第一个选项基本归结为:

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

    ...但问题当然是放置此代码的位置。特别是如果您在某种Tomcat容器或类似容器中运行,这可能很麻烦。

    另一个很大程度上取决于您的环境。基本上,如果你有一个启动应用程序的shell脚本,你可以写一些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来表示这些变量。

@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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top