javalog4j2。Spring设置的xml查找系统属性
我正在从log4j 1迁移。x比2。我们有一个属性文件“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>
我希望现在能够在log4j2中引用x.y.z
。类似于<RollingFile name="rollingFile" fileName="${sys:x.y.z}">
的xml,但是这不适用于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设置的系统属性
# 1 楼答案
如果您使用的是Spring Boot,Log4j将至少初始化3次,第一次是在Spring完成任何操作之前。所以Spring不可能为您设置这些属性。然而,初始化日志的后续调用可能能够提供属性,但这并不是真正必要的,因为Log4j可以为您处理这个问题
选项1——如果您使用的是Spring Boot,那么就包括Log4j Spring Cloud配置客户端。它包括一个SpringLookup,可以让您引用Spring配置中定义的任何属性。例如,如果你有一个应用程序。yaml包含:
您可以在log4j2中引用${spring:logging.root.level}。xml文件
选项2-如果您不使用Spring Boot或更喜欢系统属性,那么可以创建一个名为log4j2的文件。系统类路径上的属性。在Log4j初始化开始时,该文件中找到的所有属性都将由Log4j作为系统属性发布