log4j2.xml 使用 application.yml 配置的属性

参考:https://www.jianshu.com/p/1f2427c87139

log4j2.xml 是不归 spring 管理的,所以也就没法读取到 application.yml 里面的配置了。 解决方式: 通过 spring 的 监听器(Listener)功能,将我们读取到的 application.yml 的日志路径设置到系统属性,然后在日志文件里面读取对应的系统属性就行了。

LoggingListener.java

通过 spring 的 监听器(Listener)功能,将我们读取到的 application.yml 的日志路径设置到系统属性 ,或者使用MDC

java 复制代码
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.boot.context.logging.LoggingApplicationListener;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.Ordered;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;
 
/**
 * 读取yml配置传递到log4jXml中
 *
 * @author Clay
 */
@Component
public class LoggingListener implements ApplicationListener<ApplicationEvent>, Ordered {
    /**
     * 提供给日志文件读取配置的key,使用时需要在前面加上 sys:
     */
    private final static String LOG_PATH = "log.path";
 
    /**
     * spring 内部设置的日志文件的配置key
     */
    private final static String SPRING_LOG_PATH_PROP = "spring.log-file-path";
 
    @Override
    public void onApplicationEvent(ApplicationEvent applicationEvent) {
 
        if (applicationEvent instanceof ApplicationEnvironmentPreparedEvent) {
            ConfigurableEnvironment environment = ((ApplicationEnvironmentPreparedEvent) applicationEvent).getEnvironment();
            String filePath = environment.getProperty(SPRING_LOG_PATH_PROP);
            if (StringUtils.isNotEmpty(filePath)) {
                System.err.println("=================" + filePath);
                System.setProperty(LOG_PATH, filePath);
            }
        }
    }
 
    @Override
    public int getOrder() {
        // 当前监听器的启动顺序需要在日志配置监听器的前面,所以此处减 1
        return LoggingApplicationListener.DEFAULT_ORDER - 1;
    }
 
}

application.yml

yml 复制代码
spring: 
  log-file-path: "F:/logs/"

log4j2.xml

xml 复制代码
<Property name="log-path">${sys:log.path}</Property>

Application.java

这里没有贴出注解,关键于.addListeners(new LoggingListener())

内置Tomcat

java 复制代码
public class Application {
 
    public static void main(String[] args) {
        SpringApplication application = new SpringApplication(Application.class);
        // 添加 日志监听器,使 log4j2-spring.xml 可以间接读取到配置文件的属性
        application.addListeners(new LoggingListener());
        application.run(args);
    }
 
}

外置Tomcat

java 复制代码
public class TomcatApplication extends SpringBootServletInitializer {
 
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        // 添加 日志监听器,使 log4j2-spring.xml 可以间接读取到配置文件的属性
        builder.application().addListeners(new LoggingListener());
        return builder.sources(Application.class);
    }
 
}

转至:https://blog.csdn.net/xiaokanfuchen86/article/details/126695797

相关推荐
百花~6 小时前
自动化测试概念篇~
selenium·log4j
k***3883 天前
SpringBoot Test详解
spring boot·后端·log4j
马达加斯加D3 天前
C# --- 如何写UT
前端·c#·log4j
秃了也弱了。3 天前
testng:Java界功能强大的单元测试框架
java·单元测试·log4j
还算善良_4 天前
【XML生成】根据JSON格式化的报文,动态生成XML
xml·json
galaxyffang5 天前
skywalking整合logback.xml日志,日志文件出现乱码问题解决
xml·logback·skywalking
q***42056 天前
Spring Boot 整合 log4j2 日志配置教程
spring boot·单元测试·log4j
百***26636 天前
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
xml·spring·logback
864记忆6 天前
Qt 对 JSON和XML文件的操作详解
xml·qt·json
a***97687 天前
使用 Logback 的最佳实践:`logback.xml` 与 `logback-spring.xml` 的区别与用法
xml·spring·logback