我只是想知道是否有办法在LOG4J中为属性替换提供默认值?
我想在java系统属性中传递文件路径,然后将其与“$ {env:mySystemProperty}”一起使用。但是如果开发人员忘记设置此属性呢?然后我想在log4j2.xml中定义一些有意义的默认值。
知道如何实现此功能吗?
编辑:
env替换对我不起作用:
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">
我可以在wildfly控制台中看到该属性,我重新启动了服务器,但我无法完成它。
答案 0 :(得分:60)
默认属性地图
关注http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution 您可以在配置文件中指定默认属性映射。采取这种形式:
<Configuration status="debug">
<Properties>
<Property name="oauthLoginLogPath">default/location/of/oauth2.log</Property>
</Properties>
...
<Appenders>
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}">
....
</Configuration
然后,如果您使用系统属性-DoauthLoginLogPath=/path/oauth2.log
启动应用程序,将首先在系统属性中查找File appender fileName
值,但如果失败,它将回退到定义的属性在log4j2.xml配置文件顶部的Properties
部分中。
<强>内联强>
第二种方法是提供内联的默认值:
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
通常所有Log4j2查找都遵循以下模式:${type:key:-defaultValue}
。
Env vs sys
顺便说一句,env
前缀用于环境变量(如Windows上的%PATH%),与sys
无关,后者是Java系统属性。另请参阅http://logging.apache.org/log4j/2.x/manual/lookups.html
答案 1 :(得分:15)
您可以使用相同的${sys:propName:-default}
语法。请注意&#39;: - &#39;,它被称为&#34; 变量默认值分隔符 &#34;。 &#34; 变量默认值分隔符的默认值&#34;是:-
,如 bash 和其他 * nix shell。
您可以在StrSubstitutor类的Log4j 2文档中阅读有关此内容的更多信息。
使用相同的例子:
<Configuration status="debug">
...
<Appenders>
<Appender type="File" name="File"
fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
....
</Appenders>
</Configuration>