How to give environmental variable path for file appender in configuration file in log4j

JavaLog4jEnvironment Variables

Java Problem Overview


I have a log4j.xml config file. and a RollingFileAppender to which I need to provide file path for storing logs. The problem is my code will be deployed on Unix machine as a runnable jar. So if I pass parameter something like this:

value=logs/messages.log"

it creates folder named logs inside my HOME directory and writes all the messages to file inside this directory.

I have a environmental variable set to some value. I want to use path of that variable and write messages under that path. How can I achieve it?

I had tried using this:

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

but this does not work. Can anyone suggest a solution for this problem?

Java Solutions


Solution 1 - Java

When parsing its configuration file, the expression ${MY_HOME} will be expanded to the value of the system property named MY_HOME, not the system environment variable. There's a difference between the two.

To achieve this in a clean way, you'll have to add something like this to the JVM invocation line:

-DMY_HOME=$MY_HOME

That would define the Java system property MY_HOME to contain the value of the environment variable MY_HOME.

Solution 2 - Java

you CAN give it environment variables. Just preppend env: before the variable name, like this:

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

Solution 3 - Java

This syntax is documented only in log4j 2.X so make sure you are using the correct version.

    <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

Solution 4 - Java

I got this working.

  1. In my log4j.properties. I specified

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

  1. in eclipse - JVM arguments

> -DLogFilePath=C:\work\MyLogFile.log

Solution 5 - Java

java -DLOG_DIR=${LOG_DIR} -jar myjar.jar "param1" "param2" ==> in cmd line if you have "value="${LOG_DIR}/log/clientProject/project-error.log" in xml

Solution 6 - Java

Maybe... :

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}

Solution 7 - Java

Log4j entry

#- File to log to and log format

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");
}

Solution 8 - Java

To dynamically change a variable you can do something like this:

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);

Solution 9 - Java

Since you are using unix you can use a path like this.

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

path should start with /

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnkur ShanbhagView Question on Stackoverflow
Solution 1 - JavaIsaacView Answer on Stackoverflow
Solution 2 - JavaDaniel EstradaView Answer on Stackoverflow
Solution 3 - JavaShohamView Answer on Stackoverflow
Solution 4 - JavahmehandiView Answer on Stackoverflow
Solution 5 - JavaShirish CoolkarniView Answer on Stackoverflow
Solution 6 - Javatux23View Answer on Stackoverflow
Solution 7 - JavaThiyag MohanView Answer on Stackoverflow
Solution 8 - Javatux23View Answer on Stackoverflow
Solution 9 - JavasomeoneView Answer on Stackoverflow