I just wonder if there is any way to provide default value for property substitution in LOG4J?
I want to pass file path in java system property and then use it with "${env:mySystemProperty}". But what if developer forgets to set this property? Then I would like to have some meaningful default value defined in log4j2.xml.
Any idea how to achieve this functionality?
EDIT:
The env substitution does not work for me:
standalone.conf
-DoauthLoginLogPath=/path/oauth2.log
log44j2.xml
<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true">
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true">
I can see in wildfly console the property, I restarted server but I cannot get it done.
You can use the same
${sys:propName:-default}
syntax. Notice the ':-', it is is called "variable default value delimiter". The default value for the "variable default value delimiter" is:-
, as in bash and other *nix shells.You can read more about this in the Log4j 2 documentation for the StrSubstitutor class.
To use the same example:
Default Property map
Looking at http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution you can specify a default property map in the configuration file. That takes this form:
Then, if you start your app with system property
-DoauthLoginLogPath=/path/oauth2.log
, the File appenderfileName
value will first be looked up in system properties, but if that fails, it will fall back to the property defined in theProperties
section at the top of the log4j2.xml configuration file.Inline
A second way is to provide the default value inline:
Generally all Log4j2 lookups follow this pattern:
${type:key:-defaultValue}
.Env vs sys
By the way, the
env
prefix is for environment variables (like %PATH% on Windows), and is not related tosys
, which is Java system properties. See also http://logging.apache.org/log4j/2.x/manual/lookups.html