因为spring搭建的web项目打包时默认将resource文件夹下的文件一起打包,但是我们又想在打包后修改某些配置
这里以我遇到的logback.xml配置更改默认路径来看
根据LoggerFactory.getLogger的方法找到加载文件的位置,如下
public URL findURLOfDefaultConfigurationFile ( boolean updateStatus ) { ClassLoader myClassLoader = Loader . getClassLoaderOfObject ( this ); URL url = findConfigFileURLFromSystemProperties ( myClassLoader , updateStatus ); if ( url != null ) { return url ; } url = getResource ( TEST_AUTOCONFIG_FILE , myClassLoader , updateStatus ); if ( url != null ) { return url ; } url = getResource ( GROOVY_AUTOCONFIG_FILE , myClassLoader , updateStatus ); if ( url != null ) { return url ; } return getResource ( AUTOCONFIG_FILE , myClassLoader , updateStatus ); }可以看出是根据顺序依次往下寻找配置文件位置,在该类的属性中定义了对应的变量值如下
public class ContextInitializer { final public static String GROOVY_AUTOCONFIG_FILE = "logback.groovy" ; final public static String AUTOCONFIG_FILE = "logback.xml" ; final public static String TEST_AUTOCONFIG_FILE = "logback-test.xml" ; final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile" ;具体加载顺序参照静态变量上面代码块的查找顺序
那么我们想修改配置文件位置,只需找到第一个加载的方法中是如何加载的,因为后面加载文件的位置都是代码默认写死了的
可以看到上面代码块中,最先加载的代码块是
URL url = findConfigFileURLFromSystemProperties ( myClassLoader , updateStatus ); if ( url != null ) { return url ; }点进去之后可以看到
private URL findConfigFileURLFromSystemProperties ( ClassLoader classLoader , boolean updateStatus ) { String logbackConfigFile = OptionHelper . getSystemProperty ( CONFIG_FILE_PROPERTY );这里可以看到OptionHelper.getSystemProperty(CONFIG_FILE_PROPERTY)传入的是静态变量中的
final public static String CONFIG_FILE_PROPERTY = "logback.configurationFile" ;</ div > <div> OptionHelper . getSystemProperty 中的内容是</ div > public static String getSystemProperty ( String key ) { try { return System . getProperty ( key ); } catch ( SecurityException e ) { return null ; } }可以看出是从 System.getProperty()中获取的,而key是静态变量。
所以我们只要在系统启动时,设置一个System.setProperty()就可以了,如下
这一步设置配置文件路径
private static final Logger log ; static { System . setProperty ( "logback.configurationFile" , "./logback.xml" ); log = LoggerFactory . getLogger ( MonitorApplication . class ); }就是根据代码里定义的key,传一个文件路径的value到System的Peoperty里
提示:此方式与@Slf4j一起使用时,在设置 System.setProperty()代码块之前就加载的类中不适用,因为此时还未设置文件位置,但是静态常量就已经被加载赋值了,比如下面我在main方法中这么定义,main方法中的日志将失去配置文件效果
private static final Logger log = LoggerFactory . getLogger ( MonitorApplication . class );; static { System . setProperty ( "logback.configurationFile" , "./logback.xml" ); } public static void main ( String [] args ) {}因为如果在定义时就赋值,那么jvm是先加载 静态属性,然后在执行静态代码块的,所以导致System.setProperty()赋值在 log变量赋值以后执行,那么设置的文件位置也就不生效了
@Slf4j注解也一样,@Slf4j注解后生成的class是下面这样的:
public class MonitorApplication { private static final Logger log = LoggerFactory . getLogger ( MonitorApplication . class );所以我们可以选择下面这中jvm启动时带的参数
打包后的控制台启动设置参数可以百度一下,下面是我打包后控制台启动的参数设置例子
java - Dlogback . configurationFile =./ logback . xml - jar monitor - 1.0 - SNAPSHOT . jar
补充:springboot打包去除资源文件,启动时指定配置文件位置,使用log4j2替换默认logback
springboot打包时,去掉资源文件
<build> <resources> <resource> <directory> src/main/resources </directory> <excludes> <exclude> *.properties </exclude> <exclude> *.xml </exclude> </excludes> </resource> </resources> <plugins> <plugin> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-maven-plugin </artifactId> </plugin> <plugin> <groupId> org.apache.maven.plugins </groupId> <artifactId> maven-surefire-plugin </artifactId> <configuration> <skipTests> true </skipTests> </configuration> </plugin> </plugins> </build>但这样配置后,在eclipse中启动springboot项目,则会出现读取不到配置资源的情况,所以在eclipse启动项目时,需要注释掉如下配置
<resources> <resource> <directory> src/main/resources </directory> <excludes> <exclude> *.properties </exclude> <exclude> *.xml </exclude> </excludes> </resource> </resources>如果修改了pom文件之后,程序运行异常,如果使用eclipse,则可通过右键Maven -- Update Project更新下maven依赖,再次启动服务
启动时指定配置文件位置
项目打成jar包后,运行时,可将配置文件放入jar包同级目录下或者在同级的config目录下(放入classpath下或者classpath下config目录下也可以,但是打成jar包,就需要一起打包出来)
配置文件加载顺序为:
jar包同级目录下的config文件夹下配置
jar包同级目录下配置
classpath下config目录下配置
classpath下配置
java - Xms100m - Xmx100m - jar myboot001 - 0.0 . 1 - SNAPSHOT . jar &也可指定加载配置文件的地址
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方式启动
java - Xms100m - Xmx100m - jar myboot001 - 0.0 . 1 - SNAPSHOT . jar -- spring . config . location = configs / application . properties -- debug使用log4j2替换默认日志框架logback
添加log4j2日志框架依赖
<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-log4j2 </artifactId> </dependency>此时启动服务时,将会有如下提示
从日志记录看,依然使用的为logback日志,网上搜索了一些资料得知,需要排除掉默认的日志框架才会生效
本例使用了两个spring-boot-starter-data-redis和spring-boot-starter-jdbc依赖,且它们也都有日志框架的依赖,排除默认框架时,只需将写在最前面的starter依赖中添加排除默认日志框架的代码即可
<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-data-redis </artifactId> <exclusions> <exclusion> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-logging </artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-jdbc </artifactId> </dependency>或者添加如下依赖处理(位置不限)
<dependency> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter </artifactId> <exclusions> <exclusion> <groupId> org.springframework.boot </groupId> <artifactId> spring-boot-starter-logging </artifactId> </exclusion> </exclusions> </dependency>以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/weixin_46415189/article/details/110493068
查看更多关于如何修改logback.xml配置文件在resource以外的位置的详细内容...