如何修改logback.xml配置文件在resource以外的位置

时间:2022-09-06 09:26:08

因为spring搭建的web项目打包时默认将resource文件夹下的文件一起打包,但是我们又想在打包后修改某些配置

这里以我遇到的logback.xml配置更改默认路径来看

根据LoggerFactory.getLogger的方法找到加载文件的位置,如下

  1. public URL findURLOfDefaultConfigurationFile(boolean updateStatus) {
  2. ClassLoader myClassLoader = Loader.getClassLoaderOfObject(this);
  3. URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
  4. if (url != null) {
  5. return url;
  6. }
  7. url = getResource(TEST_AUTOCONFIG_FILE, myClassLoader, updateStatus);
  8. if (url != null) {
  9. return url;
  10. }
  11. url = getResource(GROOVY_AUTOCONFIG_FILE, myClassLoader, updateStatus);
  12. if (url != null) {
  13. return url;
  14. }
  15. return getResource(AUTOCONFIG_FILE, myClassLoader, updateStatus);
  16. }

可以看出是根据顺序依次往下寻找配置文件位置,在该类的属性中定义了对应的变量值如下

  1. public class ContextInitializer {
  2. final public static String GROOVY_AUTOCONFIG_FILE = "logback.groovy";
  3. final public static String AUTOCONFIG_FILE = "logback.xml";
  4. final public static String TEST_AUTOCONFIG_FILE = "logback-test.xml";
  5. final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";

具体加载顺序参照静态变量上面代码块的查找顺序

那么我们想修改配置文件位置,只需找到第一个加载的方法中是如何加载的,因为后面加载文件的位置都是代码默认写死了的

可以看到上面代码块中,最先加载的代码块是

  1. URL url = findConfigFileURLFromSystemProperties(myClassLoader, updateStatus);
  2. if (url != null) {
  3. return url;
  4. }

点进去之后可以看到

  1. private URL findConfigFileURLFromSystemProperties(ClassLoader classLoader, boolean updateStatus) {
  2. String logbackConfigFile = OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY);

这里可以看到OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY)传入的是静态变量中的

  1. final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile";</div>
  2. <div>OptionHelper.getSystemProperty中的内容是</div>
  3. public static String getSystemProperty(String key) {
  4. try {
  5. return System.getProperty(key);
  6. } catch (SecurityException e) {
  7. return null;
  8. }
  9. }

可以看出是从 System.getProperty()中获取的,而key是静态变量。

所以我们只要在系统启动时,设置一个System.setProperty()就可以了,如下

这一步设置配置文件路径

  1. private static final Logger log;
  2. static {
  3. System.setProperty("logback.configurationFile","./logback.xml");
  4. log = LoggerFactory.getLogger(MonitorApplication.class);
  5. }

就是根据代码里定义的key,传一个文件路径的value到System的Peoperty里

提示:此方式与@Slf4j一起使用时,在设置 System.setProperty()代码块之前就加载的类中不适用,因为此时还未设置文件位置,但是静态常量就已经被加载赋值了,比如下面我在main方法中这么定义,main方法中的日志将失去配置文件效果

  1. private static final Logger log = LoggerFactory.getLogger(MonitorApplication.class);;
  2. static {
  3. System.setProperty("logback.configurationFile","./logback.xml");
  4. }
  5. public static void main(String[] args) {}

因为如果在定义时就赋值,那么jvm是先加载 静态属性,然后在执行静态代码块的,所以导致System.setProperty()赋值在 log变量赋值以后执行,那么设置的文件位置也就不生效了

@Slf4j注解也一样,@Slf4j注解后生成的class是下面这样的:

  1. public class MonitorApplication {
  2. private static final Logger log = LoggerFactory.getLogger(MonitorApplication.class);

所以我们可以选择下面这中jvm启动时带的参数

如何修改logback.xml配置文件在resource以外的位置

打包后的控制台启动设置参数可以百度一下,下面是我打包后控制台启动的参数设置例子

如何修改logback.xml配置文件在resource以外的位置

  1. java -Dlogback.configurationFile=./logback.xml -jar monitor-1.0-SNAPSHOT.jar

补充:springboot打包去除资源文件,启动时指定配置文件位置,使用log4j2替换默认logback

springboot打包时,去掉资源文件

  1. <build>
  2. <resources>
  3. <resource>
  4. <directory>src/main/resources</directory>
  5. <excludes>
  6. <exclude>*.properties</exclude>
  7. <exclude>*.xml</exclude>
  8. </excludes>
  9. </resource>
  10. </resources>
  11. <plugins>
  12. <plugin>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-maven-plugin</artifactId>
  15. </plugin>
  16.  
  17. <plugin>
  18. <groupId>org.apache.maven.plugins</groupId>
  19. <artifactId>maven-surefire-plugin</artifactId>
  20. <configuration>
  21. <skipTests>true</skipTests>
  22. </configuration>
  23. </plugin>
  24. </plugins>
  25. </build>

但这样配置后,在eclipse中启动springboot项目,则会出现读取不到配置资源的情况,所以在eclipse启动项目时,需要注释掉如下配置

  1. <resources>
  2. <resource>
  3. <directory>src/main/resources</directory>
  4. <excludes>
  5. <exclude>*.properties</exclude>
  6. <exclude>*.xml</exclude>
  7. </excludes>
  8. </resource>
  9. </resources>

如果修改了pom文件之后,程序运行异常,如果使用eclipse,则可通过右键Maven -- Update Project更新下maven依赖,再次启动服务

启动时指定配置文件位置

项目打成jar包后,运行时,可将配置文件放入jar包同级目录下或者在同级的config目录下(放入classpath下或者classpath下config目录下也可以,但是打成jar包,就需要一起打包出来)

配置文件加载顺序为:

jar包同级目录下的config文件夹下配置

jar包同级目录下配置

classpath下config目录下配置

classpath下配置

  1. java -Xms100m -Xmx100m -jar myboot001-0.0.1-SNAPSHOT.jar &

也可指定加载配置文件的地址

  1. java -Xms100m -Xmx100m -jar myboot001-0.0.1-SNAPSHOT.jar --spring.config.location=configs/application.properties --logging.config=./log4j2.xml >> /dev/null 2>&1 &

以DEBUG方式启动

  1. java -Xms100m -Xmx100m -jar myboot001-0.0.1-SNAPSHOT.jar --spring.config.location=configs/application.properties --debug

使用log4j2替换默认日志框架logback

添加log4j2日志框架依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-log4j2</artifactId>
  4. </dependency>

此时启动服务时,将会有如下提示

如何修改logback.xml配置文件在resource以外的位置

从日志记录看,依然使用的为logback日志,网上搜索了一些资料得知,需要排除掉默认的日志框架才会生效

本例使用了两个spring-boot-starter-data-redis和spring-boot-starter-jdbc依赖,且它们也都有日志框架的依赖,排除默认框架时,只需将写在最前面的starter依赖中添加排除默认日志框架的代码即可

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-jdbc</artifactId>
  14. </dependency>

或者添加如下依赖处理(位置不限)

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-logging</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/weixin_46415189/article/details/110493068