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

相关推荐
JustNow_Man14 小时前
【Claude Code】 中给 Python + XML 项目建立可靠验证体系
xml·linux·python
JustNow_Man15 小时前
【OpenSpec】/opsx:archive 的作用是什么解析
log4j
AI产品实战1 天前
Gradle打包生成dependencies.xml详解
xml·java·gradle
星释2 天前
鸿蒙智能体开发实战:27.Skill 测试、发布与管理
ui·华为·log4j·harmonyos·鸿蒙·智能体
充钱大佬2 天前
Python测试基础教程
python·log4j·apache
xiaoshuaishuai82 天前
C# AI实现PR处理、单元测试
开发语言·c#·log4j
斯特凡今天也很帅3 天前
xml页面可以打开,不报错,但是显示数据的地方也不显示,我是怎么解决的
xml·vue.js
醉熏的斑马4 天前
ASP.Net MVC3 】使用Moq让单元测试变得更简单
单元测试·log4j·asp.net
前网易架构师-高司机4 天前
带标注的21种中药材识别数据集,识别率73.8%数据集,2237张图,支持yolo,coco json,voc xml,文末有模型训练代码
xml·yolo·json·数据集·中药·药材·中草药
snow@li4 天前
Java:pom.xml全景深度分析 / 机制、标签、依赖、打包、生产避坑全解 / 工程基石
xml·java·开发语言