62

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

value=logs/messages.log"

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

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

我试过用这个:

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

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

4

9 回答 9

59

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

为了以干净的方式实现这一点,您必须在 JVM 调用行中添加类似这样的内容:

-DMY_HOME=$MY_HOME

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

于 2012-10-25T10:22:38.383 回答
53

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

value="${env:MY_HOME}/logs/message.log"
于 2014-02-21T15:07:14.767 回答
12

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

于 2015-03-29T13:52:08.810 回答
10

我得到了这个工作。

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

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

  1. 在 Eclipse 中 - JVM 参数

-DLogFilePath=C:\work\MyLogFile.log

于 2015-06-30T12:58:06.927 回答
2

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

于 2014-05-21T15:50:07.390 回答
0

也许... :

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}
于 2012-10-25T10:12:38.350 回答
0

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");
}
于 2018-07-31T17:37:57.503 回答
-2

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

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);
于 2012-10-25T10:18:51.830 回答
-3

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

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

路径应以 / 开头

于 2012-10-25T10:05:13.547 回答