在log4j xml配置中使用系统环境变量

问题描述 投票:0回答:6
java xml configuration log4j environment-variables
6个回答
55
投票

我最近尝试这样做,但无法使其发挥作用。我最终做的是在启动时发送一个变量。假设您有一个名为 $LOG_LEVEL 的环境变量:

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

在启动时...

java -Dlog_level=$LOG_LEVEL your_app

29
投票

此语法仅记录在 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>

12
投票

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

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

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

第一个选项基本上可以归结为:

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 或类似的。


6
投票

您需要在 env 和变量名称之间放置一个冒号,如下所示:

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

0
投票

创建系统变量。我更喜欢使用 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>

0
投票

只要在调用主程序时这样做,就可以解决问题

  1. -DLOG4J_CONFIGURATION_FILE=P
© www.soinside.com 2019 - 2024. All rights reserved.