目录

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
WenCoo2 小时前
python3使用lxml解析xml时踩坑记录
xml·开发语言·python
为美好的生活献上中指16 小时前
java每日精进 3.21 【SpringBoot规范2.0】
java·开发语言·spring boot·log4j·async·mail
-$_$-2 天前
【MyDB】5-索引管理之4-单元测试
单元测试·log4j
JeJe同学3 天前
将 VOC 格式 XML 转换为 YOLO 格式 TXT
xml·yolo
Answer_ism3 天前
【SpringMVC】SpringMVC进阶,类型转换器源码分析,json转换,视图解析器,以及操作各种域的API
xml·java·开发语言·后端·spring·tomcat·json
敖云岚4 天前
【Spring】第四弹:基于XML文件注入Bean对象
xml·java·spring
w_t_y_y4 天前
IntelliJ 配置文件plugin.xml
xml·java·开发语言
敖云岚4 天前
【Spring】第三弹:基于 XML 获取 Bean 对象
xml·java·spring
JeJe同学4 天前
将 YOLO 格式的标注文件(.txt)转换为 VOC 格式的 XML 标注文件
xml·深度学习·yolo
爱的叹息4 天前
java使用(Preference、Properties、XML、JSON)实现处理(读写)配置信息或者用户首选项的方式的代码示例和表格对比
xml·java·json