首页 > 解决方案 > log4j2.xml 查找 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>

我希望现在能够x.y.z在 log4j2.xml中引用<RollingFile name="rollingFile" fileName="${sys: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 设置的系统属性?

标签: javaspringlog4j2slf4japplicationcontext

解决方案


如果您使用 Spring Boot,Log4j 将至少初始化 3 次,第一次是在 Spring 执行任何操作之前。所以 Spring 不可能为你设置这些属性。但是,后续调用初始化日志记录可能能够提供属性,但这并不是必需的,因为 Log4j 可以为您处理这个。

选项 1 - 如果您使用 Spring Boot,则包括 Log4j Spring Cloud Config Client。它包括一个 SpringLookup,可以让您引用 Spring 配置中定义的任何属性。例如,如果您的 application.yaml 包含:

logging:
  root:
    level:

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

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


推荐阅读