Log4J2 属性替换 - 默认

Posted

技术标签:

【中文标题】Log4J2 属性替换 - 默认【英文标题】:Log4J2 property substitution - default 【发布时间】: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 控制台中看到该属性,我重新启动了服务器但我无法完成它。

【问题讨论】:

【参考方案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:-defaultsyntax。注意':-',它被称为“变量默认值分隔符”。 “变量默认值分隔符”的默认值为:-,如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 :)

以上是关于Log4J2 属性替换 - 默认的主要内容,如果未能解决你的问题,请参考以下文章

十一springboot 配置log4j2以及打包成zip文件

十springboot 配置log4j2以及打包成zip文件

Spring Boot 2 中如何使用 Log4j2 记录日志

log4j2替换log4j需要修改哪些地方

默认 Spring Boot log4j2 日志模式

在配置属性中使用 Log4j2 定义时间限制