Log4J2属性替换 - 默认

时间:2014-02-25 23:21:18

标签: java logging log4j log4j2

我只是想知道是否有办法在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控制台中看到该属性,我重新启动了服务器,但我无法完成它。

2 个答案:

答案 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>