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

Posted

技术标签:

【中文标题】在 log4j xml 配置中使用系统环境变量【英文标题】:Using system environment variables in log4j xml configuration 【发布时间】:2010-09-17 02:27:47 【问题描述】:

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

我希望能够做类似的事情:

<level value="$env.LOG_LEVEL" />

并让它从系统环境变量中获取,这样我就可以避免使用 -D 参数传递这么多东西。

【问题讨论】:

我刚刚评论了最受好评的答案并解释了我的推理。我刚刚也赞成我接受的答案,因为它的价值。 【参考方案1】:

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

<level value="$log_level" />

在启动时...

java -Dlog_level=$LOG_LEVEL your_app

【讨论】:

我专门询问了如何做到这一点而不必将它们全部设置为 -D 参数,所以这根本不能回答我的问题。【参考方案2】:

此语法仅记录在 log4j 2.X 中,因此请确保您使用的是正确的版本。它不适用于 1.X 版本。

    <Appenders>
    <File name="file" fileName="$env:LOG_PATH">
        <PatternLayout>
            <Pattern>%d %p %c1. [%t] %m %ex%n</Pattern>
        </PatternLayout>
    </File>
</Appenders>

【讨论】:

您还可以使用以下语法$env:LOG_PATH:-/default/path 指定默认值,如果未设置LOG_PATH,则将使用/default/path 使用 1.x 版是否有任何解决方法可以使这项工作? $env:LOG_PATH 对我不起作用。而是 $sys:LOG_PATH 起作用了。【参考方案3】:

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

    在配置 Log4J 之前使用 System.setProperty

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

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

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

【讨论】:

【参考方案4】:

你需要在 env 和变量名之间加一个冒号,像这样:

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

【讨论】:

【参考方案5】:

创建一个系统变量。我更喜欢将 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 %c1 %m %n" />
  </layout>
</appender>

【讨论】:

您在此处显示的语法 $APP_LOG_ROOTDIR 是否查看系统环境变量,而不仅仅是 Java 系统属性?我的理解(和经验)是它只查看 Java 系统属性,而不是环境变量。 @DerekLewis 是的,语法着眼于系统环境变量。这些变量在启动时可供 tomcat 使用,类似于 tomcat 通过 setenv.bat 脚本提供的变量set。注意,我只在 Windows 上使用过这个。在 *nix 上这对我来说不是问题,所以我不必使用这个解决方案。

以上是关于在 log4j xml 配置中使用系统环境变量的主要内容,如果未能解决你的问题,请参考以下文章

log4j的详细配置

log4j2.xml日志文件设置文件路径

AWS lambda:如果log4j.xml中不存在环境变量,有没有办法设置默认值?

server.xml 中的环境/系统变量

server.xml中的环境/系统变量

如何将log4j2.xml 放在classpath