目 录CONTENT

文章目录

log4j2使用application配置文件的属性

筱晶哥哥
2023-02-10 / 0 评论 / 0 点赞 / 91 阅读 / 5804 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-03-23,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

使用log4j2日志框架的时候,由于log4j2.xml不属于spring管理,所以在log4j2.xml就无法读取到application.yml中配置的属性值。

这时候可以根据spring的监听器功能,将application.yml中的属性值读取到系统配置中,然后log4j2.xml直接使用系统属性就行了,在log4j2.xml中是可以读取到系统属性值的。

参考文章:log4j2.xml 使用 application.yml 配置的属性

LoggingListener

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

/**
 * @Description: 日志监听器,读取yml配置文件参数到log4j.xml中
 * @Author: 公众号:程序员阿晶
 * @CreateTime: 2023-02-09 10:17
 */
@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.setProperty(LOG_PATH, filePath);
            }
        }
    }

    @Override
    public int getOrder() {
        // 当前监听器的启动顺序需要在日志配置监听器的前面,所以此处减 1
        return LoggingApplicationListener.DEFAULT_ORDER - 1;
    }

}

application.yml

spring:
  log-file-path: /logs/xxxx/

log4j2.xml

<Property name="log-path">${sys:log.path}</Property>

Application.java

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

内置Tomcat

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

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

评论区