文章目录
- 背景
- 查找logback内部状态以及生效的配置文件
- 解决
背景
最近项目中出现个问题,自定义的logback.xml
不生效,排查发现项目中出现了2个logback.xml
,另一个在依赖Jar中,使用的在依赖Jar中的logback.xml
,导致我们自定义的配置无法生效。
my-app/
config/
logback.xml
lib/
aaa-lib.jar
logback.xml -- 隐藏bug
bbb-lib.jar
最好不要将配置文件打包到jar包中,因为增加配置文件本质上就是为了方便用户调整参数配置。
如果将它打包到jar包中,你需要修改指定的文件并从新打包,上线。
重点日志:
Resource [logback.xml] occurs multiple times on the classpath
.
中文logback.xml文档:
- https://logbackcn.gitbook.io/logback/
查找logback内部状态以及生效的配置文件
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
或者
LoggerContext loggerContext = ((LoggerContext) LoggerFactory.getILoggerFactory());
List<Status> list = loggerContext.getStatusManager().getCopyOfStatusList();
解决
方式一 指定配置文件路径
java -Dlogback.configurationFile=/path/to/config.xml -jar xxx.jar
相关文档:https://logback.qos.ch/manual/configuration.html#configFileProperty
方式二 SpringBoot指定配置
想要自定义文件名的可配置:logging.config
指定配置文件名:
logging.config=classpath:logging-config.xml
通过将相应的库添加到classpath可以激活各种日志系统,然后在classpath根目录下提供合适的配置文件可以进一步定制日志系统,配置文件也可以通过Spring Environment
的logging.config
属性指定。
使用org.springframework.boot.logging.LoggingSystem
系统属性可以强制Spring Boot使用指定的日志系统,该属性值需要是LoggingSystem
实现类的全限定名,如果值为none
,则彻底禁用Spring Boot的日志配置。
注 由于日志初始化早于ApplicationContext
的创建,所以不可能通过@PropertySources
指定的Spring @Configuration
文件控制日志,系统属性和Spring Boot外部化配置可以正常工作。
以下文件会根据你选择的日志系统进行加载:
日志系统 | 定制配置 |
---|---|
Logback | logback-spring.xml ,logback-spring.groovy ,logback.xml 或logback.groovy |
Log4j | log4j.properties 或log4j.xml |
Log4j2 | log4j2-spring.xml 或log4j2.xml |
JDK (Java Util Logging) | logging.properties |
注 如果可能的话,建议你使用-spring
变种形式定义日志配置(例如,使用logback-spring.xml
而不是logback.xml
)。如果你使用标准的配置路径,Spring可能不能够完全控制日志初始化。