log4j2使用application配置文件的属性

使用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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* @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

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

log4j2.xml

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

Application.java

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

内置Tomcat

1
2
3
4
5
6
7
8
9
10
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

1
2
3
4
5
6
7
8
9
10
public class TomcatApplication extends SpringBootServletInitializer {

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

}

本文标题:log4j2使用application配置文件的属性

文章作者:LiJing

发布时间:2023年02月10日 - 09:46:20

最后更新:2023年06月03日 - 10:02:20

原始链接:https://blog-next.xiaojingge.com/posts/154261149.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------