log4j2如何将文件中的属性变量读入log4j2

时间:2014-03-17 17:10:38

标签: java logging jdbc log4j log4j2

背景:像往常一样,我们有各种生命周期,比如开发。 stage,lt,prod所有这些都是在部署时从环境变量$ {lifecycle}中挑选出来的。 所以JNDI设置我们将$ {lifecycle} .properties存储为变量datasource.jndi.name = jdbc / xxx。由于其他bean也使用此属性文件,因此验证此类变量是否已加载& file在classpath中,但不知怎的,我无法在下面的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>

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

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

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

另见: