问题描述

springboot2.7.8项目,引入了spring-boot-starter-logging依赖,配置文件中有logback-spring.xml,在logback-spring.xml中指定了日志目录,项目正常启动,控制台日志也正常输出,但logback-spring.xml中指定的日志文件未生成。

思考过程

第一时间想到的是Jar包冲突

  1. 有了想法就要证明自己的猜测,于是在日志文件里发现线索。
  2. 反复👀️ 看了几分钟,还是没有看到类似日志冲突的文件(排除了jar包冲突的可能性)。
  3. 出现日志jar包冲突的情况,可以在控制台看到类似日志:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/m2repo/ch/qos/logback/logback-classic/1.2.12/logback-classic-1.2.12.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/m2repo/org/slf4j/slf4j-reload4j/1.7.36/slf4j-reload4j-1.7.36.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]

换个角度解决问题

不能找到错误就想办法证明自己做的是对的。

新建空白项目,引入springboot + logback相关的最小依赖,把相同的配置拷贝过来,运行项目发现logback日志正常输出。有点信心了,证明项目本身的配置应该是正确的,问题出在引入的依赖,要解决问题大不了做加法把一个一个依赖加进来。

想到logback-spring.xml的优先级比较低,重命名logback.xml后重新运行发现logback日志配置生效了😄 。

把查jar包真的发现某个公司封装的jar包带了logback.xml配置文件,导致项目中的logback-spring.xml配置没有生效,同一个配置文件classpath的优先级比jar包里的更高。

logback日志文件加载优先级

logback优先加载自身的配置文件,加载顺序:

"logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml" 
/**
 * 定义在org.springframework.boot.logging.logback.LogbackLoggingSystem文件
 */
@Override
protected String[] getStandardConfigLocations() {
    return new String[] { "logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml" };
}

未找到的情况加载spring特性(支持profile)的配置文件,顺序同上面一致文件名后带-spring

当然实际spring日志系统比这个要复杂很多,有时间再补全。