Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在log4jxml配置中使用系统环境变量_Java_Xml_Configuration_Log4j_Environment Variables - Fatal编程技术网

Java 在log4jxml配置中使用系统环境变量

Java 在log4jxml配置中使用系统环境变量,java,xml,configuration,log4j,environment-variables,Java,Xml,Configuration,Log4j,Environment Variables,是否可以在log4jxml配置文件中引用系统环境变量(与Java系统属性相反) 我希望能够做到以下几点: <level value="${env.LOG_LEVEL}" /> 让它从系统环境变量中获取,这样我就可以避免用-D参数传递太多东西。我最近尝试过这样做,但无法让它工作。我最后做的是在启动时发送一个变量。假设您有一个名为$LOG_LEVEL的环境变量: <level value="${log_level}" /> 我认为这是不受支持的,但基本上您可以做两件事

是否可以在log4jxml配置文件中引用系统环境变量(与Java系统属性相反)

我希望能够做到以下几点:

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


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

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

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

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

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

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

  • 第一种选择基本上归结为:

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

    您还可以更改服务器启动脚本以支持此操作,例如catalina.sh或类似操作。

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

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

    此语法仅在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>
    
    
    %d%p%c{1.}[%t]%m%ex%n
    
    创建一个系统变量。对于这样的变量,我更喜欢使用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>
    
    
    
    我特别询问了如何做到这一点,而不必将它们全部设置为-D参数,因此这根本不能回答我的问题。我只是对投票最多的答案进行了评论,并解释了我的推理。我刚才还对我接受的答案投了赞成票,因为它是值得的。您在那里展示的语法${APP_LOG_ROOTDIR}是否只关注系统环境变量,而不仅仅是Java系统属性?我的理解(和经验)是,它只关注Java系统属性,而不是环境变量。@DerekLewis是的,语法关注系统环境变量。这些变量在启动时可供tomcat使用,类似于tomcat通过setenv.bat脚本设置的变量
    set
    。注意,我只在windows上使用过这个。在*nix上这对我来说不是问题,所以我从未使用过此解决方案。您还可以使用以下语法指定默认值
    ${env:LOG\u PATH:-/default/PATH}
    ,如果未设置
    LOG\u PATH
    ,则将使用
    /default/PATH
    。是否有任何方法可以使用1.x版实现此功能?${env:LOG\u PATH}不适合我。相反${sys:LOG_PATH}起了作用。
    @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>