Spring Boot默认使用Logback作为日志框架,可以通过在项目中添加logback.xml或者logback-spring.xml配置文件来配置日志输出。但是在某些情况下,我们希望将日志配置文件放在项目外部,这时就需要进行一些额外的配置。
以下是SpringBoot中项目如何读取外置logback配置文件的完整攻略:
- 首先,在项目的pom.xml中添加logback依赖:
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
- 在src/main/resources目录下创建一个名为logback.xml或logback-spring.xml的文件,并且在里面添加相应的配置。例如,以下是一个简单的logback-spring.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<springProfile name="dev">
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
</configuration>
- 在Spring Boot启动类中添加一些额外的配置,以让Spring Boot能够识别并读取外部的logback配置。以下是一个示例代码:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@SpringBootApplication
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
private static final String DEFAULT_LOG_PATH = "/logback.xml";
static {
try {
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:logback*.xml");
if(resources == null || resources.length == 0){
return;
}
for(Resource resource: resources){
if(resource instanceof ClassPathResource){
if(DEFAULT_LOG_PATH.equals(resource.getFilename())){
return;
}
}
LogbackConfigurer.initLogging(resource.getURL().getPath());
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static class LogbackConfigurer {
private static final String XML_FILE_EXTENSION = ".xml";
public static void initLogging(String configFileLocation) {
// 如果配置文件没有指定扩展名,则添加默认的扩展名
if (!configFileLocation.toLowerCase().endsWith(XML_FILE_EXTENSION)) {
configFileLocation = configFileLocation + XML_FILE_EXTENSION;
}
// 添加外部文件系统资源
Resource configLocation = new FileSystemResource(configFileLocation);
// 判断配置文件是否存在,如果不存在,则使用默认配置文件
if (!configLocation.exists()) {
configLocation = new ClassPathResource(DEFAULT_LOG_PATH);
}
// 添加属性配置占位符
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocation(configLocation);
// 重新初始化日志配置
org.springframework.core.io.ResourceLoader loader = null;
org.springframework.core.io.ResourcePatternResolver patternResolver = null;
LogbackLoggingSystem loggingSystem = new LogbackLoggingSystem(loader);
loggingSystem.beforeInitialize();
loggingSystem.initialize(configLocation, null);
loggingSystem.afterInitialize();
}
}
}
在上述代码中,我们首先查找classpath:logback*.xml(注意要加上“classpath:”前缀),返回一个org.springframework.core.io.Resource数组。然后我们检查每个资源,选择第一个匹配的文件,以此为基础调用LogbackConfigurer.initLogging()
方法,并且跳出循环。LogbackConfigurer.initLogging()
方法的作用是读取配置文件并初始化logback。
完整地说,这个方法做了以下几个步骤:
- 检查configFileLocation中是否指定了扩展名,如果没有,则添加默认的" .xml "扩展名。
- 将configFileLocation转换为一个org.springframework.core.io.FileSystemResource。
- 检查文件是否存在,如果不存在,则使用默认的配置文件。
- 添加PropertySourcesPlaceholderConfigurer,以便properties的值可以被注入到logback配置中。
-
使用LogbackLoggingSystem初始化和重新设置日志配置。
-
最后,将logback.xml或logback-spring.xml文件放在项目根目录下或者其他指定位置,并运行Spring Boot应用程序,你就能看到应用程序使用的是外部的配置文件而不是在项目中的默认设置。
以上就是SpringBoot中项目如何读取外置logback配置文件的完整攻略,这里还提供了一个示例代码和一个配置文件作为参考,供大家使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot中项目如何读取外置logback配置文件 - Python技术站