User JVM parameter in log4j2 configuration

Chris picture Chris · Jul 17, 2015 · Viewed 7.5k times · Source

I have an RollingFile Appender defined in my log4j2.xml.

<RollingFile name="RollingFile" fileName="/logs/app.log"
            filePattern="logs/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout>
                <Pattern>%d{HH:mm:ss.SSS} - %-5p - %m - [%l]%n</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="20" />
</RollingFile>

What I want to do is to pass this parameter to the JVM at startup:

-Dapp_home=/home/admin/server

The documentation is pretty straight forward. And from what I understand it should work like this:

<RollingFile name="RollingFile" fileName="${jvmrunargs:app_home}/logs/app.log"

But it doesn't. I verified that it is working in general by using the absolut path.

In an other application where I use log4j (1.x) it works like this:

log4j.appender.file.File=${app_home}/logs/app.log

Answer

hzpz picture hzpz · Jul 20, 2015

Take a look at the System Properties Lookup section of the documentation. If you define a variable as system property using -D like this:

-Dapp_home=/home/admin/server

use

${sys:app_home}

in your Log4j 2 configuration to access it.