如题。
在SpringBoot配置了logback管理日志,application.yml配置的logback配置文件相关如下:
logging:
config: classpath:logback-spring.xml
将项目打成jar包,在jar包同级目录下创建config文件夹,并复制了resources文件夹下的配置文件(包括logback-spring.xml文件)到config文件夹下。
目录结构如下图所示:
jar包所在目录
config文件夹内容
使用java -jar bak-jar.jar
执行jar包,发现修改外部config文件夹里面的log-back.xml配置不生效,仍然在读取jar包内部的log-back.xml,排查后发现,logging.config配置的是classpath:log-back.xml。
这个问题有两种解决方案
第一种解决方案:
指定正确的外部的logback-spring.xml文件的位置
修改外部配置文件的logback配置为如下:
logging:
config: ./config/logback-spring.xml
即:
logging:
# config: ./config/logback-spring.xml #部署的时候的配置
config: classpath:logback-spring.xml #开发调试运行时的配置
第二种解决方案:
把执行 java -jar bak-jar.jar
命令更换为:
java -jar -Xbootclasspath/a:jar包所在文件夹/config bak-jar.jar
第二种方案的解释:
Java类加载器的层次结构是BootstrapLoader --> ExtensionLoader --> ApplicationLoader
通过org.springframework.util.ResourceUtils.getURL("classpath:").getPath();
可以获取到Spring - Java加载类的路径,也就是说,我们在配置文件中所配置的classpath:h:logback-spring.xml
可以视为读取类加载的路径位置的:logback-spring.xml文件,当打成jar包的时候,读取的路径为file/:jar包所在目录/bak-jar.jar!/BOOT-INF/classes!/
,也就是说只会读取jar包内部的logback-spring.xml
文件。
Java 命令行提供了如何扩展 BootStrap 加载器级别 class 的简单方法,如下:
-Xbootclasspath: 完全取代基本核心的Java class 搜索路径。不常用,否则要重新写所有Java核心class
-Xbootclasspath/a: 后缀在核心class搜索路径后面。常用
-Xbootclasspath/p: 前缀在核心class搜索路径前面。不常用,避免引起不必要的冲突。
语法如下:
多个路径之间 unix使用:
号间隔,windows使用;
号间隔。
java -jar -Xbootclasspath/a:jar包所在文件夹/config bak-jar.jar
的语义为,除了原有的classpath:的路径以外,再额外扩展路径jar包所在文件夹/config
作为Spring加载资源文件路径,那么只要符合扩展的文件路径,都会被作为资源文件找到。
这样就可以成功加载到我们外部配置的log-back.xml文件了