【问题标题】:log4j2 how to read property variable from file into log4j2log4j2如何将文件中的属性变量读入log4j2
【发布时间】:2014-03-17 17:10:38
【问题描述】:

背景:像往常一样,我们有各种生命周期,例如开发。 stage、lt、prod 所有这些都是在部署时从环境变量 ${lifecycle} 中挑选出来的。 所以我们将 JNDI 设置存储在 ${lifecycle}.properties 中作为变量 datasource.jndi.name=jdbc/xxx。由于其他 bean 也在使用此属性文件,因此已验证此类变量已加载且文件位于类路径中,但不知何故,我无法在 JDBC Appender 下方的 log4j2.xml 中使用此变量。

<JDBC name="DBAppender" tableName="V1_QUERY_LOG" bufferSize="4" ignoreExceptions="false">
    <DataSource jndiName="${sys:datasource.jndi.name}" />
    <Column name="event_date" isUnicode="false" isEventTimestamp="true" />
    <Column name="log_level" isUnicode="false" pattern="%level" />
    <Column name="logger" isUnicode="false" pattern="%logger" />
    <Column name="message" isUnicode="false" pattern="%message" />
    <Column name="exception_msg" isUnicode="false" pattern="%ex{full}" />
</JDBC>

我也尝试过像“${datasource.jndi.name}”这样的选项,或者有什么方法可以让我适应

<Properties>
 <Property name="datasource.jndi.name">get datasource.jndi.name from {lifecycle}.properties</property>
</Properties>

【问题讨论】:

  • 我不知道它是否默认启用,但也许双重替换会起作用:${bundle:${sys:lifecycle}:datasource.jndi.name}
  • @anttix,试过了,bundle 不能以那种方式工作......

标签: java logging jdbc log4j log4j2


【解决方案1】:

如果你使用的不是java系统属性,而是环境变量,你不应该使用${sys:variable}前缀,而是${env:variable}前缀。另见http://logging.apache.org/log4j/2.x/manual/lookups.html#EnvironmentLookup

【讨论】:

    【解决方案2】:

    通常,在 Spring bean 配置文件中起作用的占位符在 Log4j 配置中不起作用。它们看起来一样,但语法和底层发现机制完全不同。

    例如 ${sys:something} 尝试解析 Java 系统属性。系统属性通常以-Dkey=value 格式作为命令行参数传递给JVM,而不是存储在属性文件中。

    您可以尝试使用资源包语法${bundle:MyProperties:MyKey},但这将从该特定文件加载,并且不会执行任何额外的 Spring 替换。

    另见:

    【讨论】:

      猜你喜欢
      • 2023-01-12
      • 2019-07-30
      • 2021-11-19
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 2018-08-17
      • 1970-01-01
      相关资源
      最近更新 更多