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

相关推荐
SEO_juper2 小时前
Node.js 重定向链检测工具:301 跳了几跳、有没有成环,一次看清
xml·开发语言·python·node.js·json·bash
步行cgn6 小时前
Spring MVC 核心配置文件详解:springmvc.xml 每一行配置的意义
xml·spring·mvc
泡海椒2 天前
JQuick-SQL JQuickTable 模型:XML 动态 SQL 的表封装边界
xml·数据库·sql
supabc1232 天前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
zzu123zsw3 天前
当 GPU 加速渲染遇上无头组件:拆解 Yororen UI 在 GPUI 生态下的状态解耦与 XML 模板实践
xml·ui·rust·gui·gpui
麦序子3 天前
用 pdfplumber + 正则 解析工程量清单 PDF:提取项目编码、综合单价并导出 Excel
xml·pdf·python3.11
汤姆宝库3 天前
推理时计算深拆:思维链、验证搜索与测试时Scaling
log4j
ha_lydms6 天前
Xml Functions(XML 函数)
xml·大数据·hadoop·spark·数据处理·dataworks·maxcompute
Eyfcom7 天前
〖实战〗跨境报关单证自动化:XML 报文生成、PDF 套打与单一窗口同步上传的工程实现
xml·pdf·自动化·报关单证·清关自动化
泡海椒9 天前
从 XML 到 Excel:JQuick-Excel 代理与解析器如何协作
xml·excel