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