log4j2.xml 查找由 Spring 设置的系统属性
log4j2.xml lookup system properties set by Spring
我正在从 log4j 1.x 迁移到 2.x,我们有一个属性文件“foo.properties”,我们在 spring 的 applicationContext.xml
并转入系统属性:
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="foo" value="classpath:META-INF/properties/foo.properties" />
</bean>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="java.lang.System" />
<property name="targetMethod" value="getProperties" />
</bean>
</property>
<property name="targetMethod" value="putAll" />
<property name="arguments">
<util:properties>
<prop key="x.y.z">${x.y.z}</prop>
<prop key="a.b.c">${a.b.c}</prop>
...
</util:properties>
</property>
</bean>
我希望现在能够像 <RollingFile name="rollingFile" fileName="${sys:x.y.z}">
一样在 log4j2.xml 中引用 x.y.z
,但这不适用于 2.x。 1.x ${x.y.z}
工作正常。
之前,我们在 applicationContext.xml
中有这段代码来初始化 log4j:
<bean id="log4jInitialization"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
<list>
<value>classpath:log4jMain.xml</value>
</list>
</property>
</bean>
但这被删除了,因为它不适用于 2.x,这可能破坏了某些东西。如何让 log4j2 查找由 Spring 设置的系统 属性?
如果您正在使用 Spring Boot Log4j 将至少初始化 3 次,第一次是在 Spring 执行任何操作之前。因此 Spring 不可能为您设置这些属性。但是,初始化日志记录的后续调用可能能够提供属性,但这并不是真正必要的,因为 Log4j 可以为您处理。
选项 1 - 如果您正在使用 Spring 引导,则包含 Log4j Spring 云配置客户端。它包含一个 Spring 查找,可让您引用 Spring 配置中定义的任何 属性。例如,如果您的 application.yaml 包含:
logging:
root:
level:
您可以在 log4j2.xml 文件中引用 ${spring:logging.root.level}。
选项 2 - 如果您不使用 Spring 启动或更喜欢系统属性,那么您可以在类路径上创建一个名为 log4j2.system.properties 的文件。在此文件中找到的所有属性将由 Log4j 在 Log4j 初始化开始时作为系统属性发布。
我正在从 log4j 1.x 迁移到 2.x,我们有一个属性文件“foo.properties”,我们在 spring 的 applicationContext.xml
并转入系统属性:
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="foo" value="classpath:META-INF/properties/foo.properties" />
</bean>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="java.lang.System" />
<property name="targetMethod" value="getProperties" />
</bean>
</property>
<property name="targetMethod" value="putAll" />
<property name="arguments">
<util:properties>
<prop key="x.y.z">${x.y.z}</prop>
<prop key="a.b.c">${a.b.c}</prop>
...
</util:properties>
</property>
</bean>
我希望现在能够像 <RollingFile name="rollingFile" fileName="${sys:x.y.z}">
一样在 log4j2.xml 中引用 x.y.z
,但这不适用于 2.x。 1.x ${x.y.z}
工作正常。
之前,我们在 applicationContext.xml
中有这段代码来初始化 log4j:
<bean id="log4jInitialization"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="org.springframework.util.Log4jConfigurer" />
<property name="targetMethod" value="initLogging" />
<property name="arguments">
<list>
<value>classpath:log4jMain.xml</value>
</list>
</property>
</bean>
但这被删除了,因为它不适用于 2.x,这可能破坏了某些东西。如何让 log4j2 查找由 Spring 设置的系统 属性?
如果您正在使用 Spring Boot Log4j 将至少初始化 3 次,第一次是在 Spring 执行任何操作之前。因此 Spring 不可能为您设置这些属性。但是,初始化日志记录的后续调用可能能够提供属性,但这并不是真正必要的,因为 Log4j 可以为您处理。
选项 1 - 如果您正在使用 Spring 引导,则包含 Log4j Spring 云配置客户端。它包含一个 Spring 查找,可让您引用 Spring 配置中定义的任何 属性。例如,如果您的 application.yaml 包含:
logging:
root:
level:
您可以在 log4j2.xml 文件中引用 ${spring:logging.root.level}。
选项 2 - 如果您不使用 Spring 启动或更喜欢系统属性,那么您可以在类路径上创建一个名为 log4j2.system.properties 的文件。在此文件中找到的所有属性将由 Log4j 在 Log4j 初始化开始时作为系统属性发布。