【问题标题】:Log4J2 property substitution - defaultLog4J2 属性替换 - 默认
【发布时间】:2014-03-28 12:20:43
【问题描述】:

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

【问题讨论】:

    标签: java logging log4j log4j2


    【解决方案1】:

    默认属性映射

    看着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 的值将首先在系统属性中查找,但如果失败,它将回退到@987654326 中定义的属性@ 部分位于 log4j2.xml 配置文件的顶部。

    内联

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

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

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

    环境与系统

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

    【讨论】:

    • 我不知道它在以前的版本中是否有效,但这不再有效。您必须在属性中使用 ':-' 来定义默认值。
    • 如果有人正在努力设置内联默认值。请注意,该值是连字符后的值,例如如果我的默认路径是/var/log/myfile.log,那么我会写${sys:oauthLoginLogPath:-/var/log/myfile.log}
    【解决方案2】:

    您可以使用相同的${sys:propName:-default}syntax。注意':-',它被称为“变量默认值分隔符”。 “变量默认值分隔符”的默认值为:-,如bash和其他*nix 贝壳。

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

    使用相同的例子:

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

    【讨论】:

    • 不幸的是,似乎在加载 log4j2.xml 文件时解析了默认值。为例如设置默认值不起作用通过线程上下文注入的变量。
    • 更正:有效,但必须添加第二个$,例如$${ctx:username:-UNKNOWN} :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-13
    相关资源
    最近更新 更多