log4j2

How to set log4j.property to .jar location


I'm Setting up Log4j2 in a Spring-boot application. I now want to create a /log directory exactly where the .jar file is located.

This is needed as we start the java application from a startup script and the configuration should work on both windows and unix developer machines as well as a server.

I already tried with:

<RollingFile name="FileAppender" fileName="./logs/mylog.log" 
             filePattern="logs/mylog-%d{yyyy-MM-dd}-%i.log">

which just creates a log folder at the directory where the jar gets started.

then I read i should use .\log/mylog.log as .\ points to the directory of the jar file. But then it just creates a folder called .\log.

I also tried with configuration with jvm arguments and calling them at the log4j2.xml with: ${logFile}. Now a directory gets created called '${logFile}.

The only ${} command working is the directory of the log4j configuration file. But as this is inside the jar it just gets me a pretty useless folder structure

Thanks in Advance

EDIT: In the End what I did was setting up two configuration files, log4j2.xml and log4j2-prod.xml The log4j2.xml took the system property as Vikas Sachdeva mentioned, while the prod.xml got the location hard coded. Not really the solution I was looking for but made it work.


Solution

  • One solution is to pass log directory location through system properties.

    Configuration file will look like -

    <RollingFile name="FileAppender" fileName="${sys:basePath}/mylog.log" 
                 filePattern="${sys:basePath}/mylog-%d{yyyy-MM-dd}-%i.log">
    

    Now, pass VM argument basePath with absolute path of directory containing JAR file -

    java -jar myapp.jar -DbasePath=/home/ubuntu/app