Log4J2属性替换 - 默认

Leo*_*rak 42 java logging log4j log4j2

我只是想知道是否有办法为LOG4J中的属性替换提供默认值?

我想在java系统属性中传递文件路径,然后将其与"$ {env:mySystemProperty}"一起使用.但是如果开发人员忘记设置此属性呢?然后我想在log4j2.xml中定义一些有意义的默认值.

知道如何实现这个功能吗?

编辑:

env替换对我不起作用:

standalone.conf

-DoauthLoginLogPath=/path/oauth2.log
Run Code Online (Sandbox Code Playgroud)

log44j2.xml

<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true">
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true">
Run Code Online (Sandbox Code Playgroud)

我可以在wildfly控制台中看到该属性,我重新启动了服务器,但我无法完成它.

Rem*_*pma 65

默认属性映射

查看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
Run Code Online (Sandbox Code Playgroud)

然后,如果您使用系统属性启动应用程序,将首先在系统属性中查找-DoauthLoginLogPath=/path/oauth2.logFile appender fileName值,但如果失败,它将回Properties退到log4j2.xml配置文件顶部的部分中定义的属性.

排队

第二种方法是提供内联的默认值:

<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
Run Code Online (Sandbox Code Playgroud)

通常所有Log4j2查找都遵循以下模式:${type:key:-defaultValue}.

环境vs系统

顺便说一句,env前缀用于环境变量(如Windows上的%PATH%),与sysJava系统属性无关.另见http://logging.apache.org/log4j/2.x/manual/lookups.html


GoG*_*ris 17

您可以使用相同的${sys:propName:-default}语法.注意': - ',它被称为" 变量默认值分隔符 ".在默认的"价值变量默认值分隔符 "是:-,在庆典和其他的*nix炮弹.

您可以在Str4ubstitutor类的Log4j 2文档中阅读更多相关信息.

要使用相同的示例:

<Configuration status="debug">
  ...
    <Appenders>
        <Appender type="File" name="File"
                  fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
        ....
    </Appenders>
</Configuration>
Run Code Online (Sandbox Code Playgroud)

  • 更正:可行,但是必须添加第二个`$`,例如`$$ {ctx:username:-UNKNOWN}`:) (3认同)