【问题标题】:How to give environmental variable path for file appender in configuration file in log4j如何在log4j的配置文件中为文件附加程序提供环境变量路径
【发布时间】:2012-10-25 09:56:07
【问题描述】:

我有一个log4j.xml 配置文件。和一个RollingFileAppender,我需要提供用于存储日志的文件路径。问题是我的代码将作为可运行的 jar 部署在 Unix 机器上。所以如果我传递这样的参数:

value=logs/messages.log"

它在我的 HOME 目录中创建名为 logs 的文件夹,并将所有消息写入此目录中的文件。

我将环境变量设置为某个值。我想使用该变量的路径并在该路径下写入消息。我怎样才能实现它?

我试过用这个:

value="${MY_HOME}/logs/message.log"

但这不起作用。任何人都可以提出解决这个问题的方法吗?

【问题讨论】:

  • 我怀疑它只是使用您的主目录作为基础,因为那是 Java 进程的当前工作目录......

标签: java log4j environment-variables


【解决方案1】:

在解析其配置文件时,表达式${MY_HOME} 将扩展为名为@9​​87654322@ 的系统属性 的值,而不是系统环境变量。两者是有区别的。

要以简洁的方式实现这一点,您必须在 JVM 调用行中添加类似这样的内容:

-DMY_HOME=$MY_HOME

这将定义 Java 系统属性 MY_HOME 以包含环境变量 MY_HOME 的值。

【讨论】:

  • 感谢您的回复。能否请您告诉我如何将上述语句添加到 JVM 调用行。
  • 您提到您的代码部署在 Unix 机器上,作为可运行的 JAR。在你的 Unix 机器上的某个地方有一个调用 JAR 文件的 shell 脚本(或类似的东西)(使用java -jar myapp.jar,加上参数);只需将-DMY_HOME=$MY_HOME 添加到该行即可。
  • 哦,好的。谢谢@Isaac 的帮助。所以这意味着我不需要对我的 XML 文件进行任何更改:这是代码:
  • 对。您不需要对代码进行任何更改。 (如果你做对了……)
  • -DMY_HOME=$MY_HOME(不要忘记连字符)放在 VM Arguments 部分,而不是 Program arguments 部分。
【解决方案2】:

你可以给它环境变量。只需在变量名前添加 env: 即可,如下所示:

value="${env:MY_HOME}/logs/message.log"

【讨论】:

  • 考虑到您使用的是 Log4j2 而不是第一个版本,这是最终的答案。谢谢!
  • 嗨@vikingsteve,关于“这适用于log4j 2.X。不适用于1.2.17”,即使我配置为使用日志2.8.2,它仍然没有从环境变量中读取,我的 shell 脚本是 spark_submit 作业。下面是我的依赖: org.apache.logging.log4jlog4j-core2.8.2 最后,我不得不使用系统属性的方法.
【解决方案3】:

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

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

http://logging.apache.org/log4j/2.x/manual/lookups.html#EnvironmentLookup

【讨论】:

    【解决方案4】:

    我得到了这个工作。

    1. 在我的 log4j.properties 中。我指定了

    log4j.appender.file.File=${LogFilePath}

    1. 在 Eclipse 中 - JVM 参数

    -DLogFilePath=C:\work\MyLogFile.log

    【讨论】:

      【解决方案5】:

      java -DLOG_DIR=${LOG_DIR} -jar myjar.jar "param1" "param2" ==> 如果您在 xml 中有 "value="${LOG_DIR}/log/clientProject/project-error.log",请在 cmd 行中

      【讨论】:

        【解决方案6】:

        也许……:

        datestamp=yyyy-MM-dd/HH:mm:ss.SSS/zzz
        layout=%d{${datestamp}} ms=%-4r [%t] %-5p %l %n%m %n%n
        
        # infoFile 
        log4j.appender.infoFile=org.apache.log4j.RollingFileAppender
        log4j.appender.infoFile.File=${MY_HOME}/logs/message.log
        log4j.appender.infoFile.layout=org.apache.log4j.PatternLayout
        log4j.appender.infoFile.layout.ConversionPattern=${layout}
        

        【讨论】:

        • 这将是属性文件的代码。 ${MY_HOME}/logs/message.log 也可以与 XML 文件一起使用。因为我曾尝试在 XML 文件中使用类似的东西,但没有奏效。
        【解决方案7】:

        Log4j 条目

        #- 要记录的文件和记录格式

        log4j.appender.file.File=${LOG_PATH}/mylogfile.log

        Java program
        String log4jConfPath        = "path/log4j.properties";
        File log4jFile              = new File(log4jConfPath);
        if (log4jFile.exists()) {
            System.setProperty("LOG_PATH", "c:/temp/");
            PropertyConfigurator.configure(log4jFile.getAbsolutePath());
            logger.trace("test123");
        }
        

        【讨论】:

          【解决方案8】:

          动态更改变量,您可以执行以下操作:

          String value = System.getenv("MY_HOME");
          Properties prop = new Properties("log4j.properties"); 
          prop.put("MY_HOME", value); // overwrite with value from environment
          PropertyConfigurator.configure(prop);
          

          【讨论】:

          • 这是我的配置文件。这将起作用,没有问题。但我想要的是将 $MY_HOME 路径附加到文件 appender 路径,我用它来在我的 XML 配置文件中记录消息。
          • 请问在这种情况下,如何将“MY_HOME”变量传递到我的 Java 应用程序中。目前,我有以下代码“System.out.println("System MY_HOME:" + System.getenv("MY_HOME"));"但是当我尝试从 Eclipse 传递“MY_HOME”-> 运行配置-> 参数-> 程序参数时,它最终会打印出“系统 MY_HOME:null”:-DMY_HOME=$MY_HOME
          • 新属性(字符串)甚至不存在?!那么这有什么帮助呢?
          【解决方案9】:

          由于您使用的是 unix,因此您可以使用这样的路径。

            /home/Production/modulename/logs/message.log
          

          路径应该以 / 开头

          【讨论】:

          • 但是OP想使用环境变量来控制路径。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 2011-05-19
          • 1970-01-01
          • 2015-08-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多