Log4J2属性替换-默认值

62

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

我想要通过Java系统属性传递文件路径,然后使用"${env:mySystemProperty}"。但是如果开发人员忘记设置此属性怎么办?那么我希望在log4j2.xml中定义一些有意义的默认值。

有什么想法实现这个功能吗?

编辑:

对我来说env替换不起作用:

standalone.conf

-DoauthLoginLogPath=/path/oauth2.log

log4j2.xml

<Appender type="File" name="File" fileName="${env:oauthLoginLogPath}" immediateFlush="true">
<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath}" immediateFlush="true">

我可以在WildFly控制台中看到该属性,我已经重启了服务器,但仍未生效。

2个回答

88

默认属性映射

查看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启动应用程序,则fileName值将首先在系统属性中查找,但如果失败,它将回退到log4j2.xml配置文件顶部定义的Properties部分中的属性。

内联方式

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

<Appender type="File" name="File" fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">

通常所有的Log4j2查找都遵循这个模式:${type:key:-defaultValue}

环境变量 vs 系统属性

顺便提一下,env前缀是用于环境变量(例如Windows上的%PATH%),与sys无关,后者是Java系统属性。另请参见http://logging.apache.org/log4j/2.x/manual/lookups.html


我不知道它在之前的版本中是否有效,但现在已经不起作用了。您必须在属性中使用“:-”来定义默认值。 - GoGoris
如果有人在设置默认值时遇到困难,请注意值是连字符后面的内容,例如,如果我的默认路径是/var/log/myfile.log,那么我会写${sys:oauthLoginLogPath:-/var/log/myfile.log} - Jose Duarte

22
你可以使用相同的${sys:propName:-default}语法。请注意“:-”,它被称为“变量默认值分隔符”。"变量默认值分隔符"的默认值是:-,与bash和其他*nix shell相同。
您可以在Log4j 2文档中了解更多关于StrSubstitutor类的信息。
要使用相同的示例:
<Configuration status="debug">
  ...
    <Appenders>
        <Appender type="File" name="File"
                  fileName="${sys:oauthLoginLogPath:-default/location/of/oauth2.log}">
        ....
    </Appenders>
</Configuration>

不幸的是,似乎默认值在加载log4j2.xml文件时解析。无法为通过线程上下文注入的变量设置默认值。 - rec
5
更正:这个方法可以使用,但需要添加第二个美元符号,例如 $${ctx:username:-UNKNOWN} :) - rec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接