有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    如果您使用的是Spring Boot,Log4j将至少初始化3次,第一次是在Spring完成任何操作之前。所以Spring不可能为您设置这些属性。然而,初始化日志的后续调用可能能够提供属性,但这并不是真正必要的,因为Log4j可以为您处理这个问题

    选项1——如果您使用的是Spring Boot,那么就包括Log4j Spring Cloud配置客户端。它包括一个SpringLookup,可以让您引用Spring配置中定义的任何属性。例如,如果你有一个应用程序。yaml包含:

    logging:
      root:
        level:
    

    您可以在log4j2中引用${spring:logging.root.level}。xml文件

    选项2-如果您不使用Spring Boot或更喜欢系统属性,那么可以创建一个名为log4j2的文件。系统类路径上的属性。在Log4j初始化开始时,该文件中找到的所有属性都将由Log4j作为系统属性发布