問(wèn)題描述
目的: 用logback替代log4j作為Spring MVC項(xiàng)目的日志處理組件
環(huán)境+框架: win10 + idea + ssm
問(wèn)題: 在項(xiàng)目中引入相關(guān)依賴及l(fā)ogback-spring.xml配置文件后, 啟動(dòng)項(xiàng)目, 配置未生效
?引入依賴及作用講解
<!-- 是log4j的一個(gè)改良版本,同時(shí)它完整實(shí)現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging -->
????????<dependency>
????????????<groupId>ch.qos.logback</groupId>
????????????<artifactId>logback-classic</artifactId>
????????????<version>1.2.3</version>
????????</dependency>
????????<!-- slf4j-api作為日志接入的接口 -->
????????<dependency>
????????????<groupId>org.slf4j</groupId>
????????????<artifactId>slf4j-api</artifactId>
????????????<version>1.7.25</version>
????????</dependency>
<!-- slf4j-log4j12:連接slf4j-api和log4j中間的適配器-->
? ? ? ? <dependency>
????????????<groupId>org.slf4j</groupId>
????????????<artifactId>slf4j-log4j12</artifactId>
????????????<version>1.7.25</version>
????????</dependency>
bug 追蹤
1.?是否在別的jar中也存在logback-spring.xml文件導(dǎo)致配置被覆蓋?
? ? 經(jīng)過(guò)排查, 項(xiàng)目中并無(wú)第二個(gè)logback-spring.xml文件, 所以不存在配置被覆蓋而不生效的可能;
2.?跟進(jìn)日志系統(tǒng)啟動(dòng)相關(guān)源碼, 查看加載配置過(guò)程
? ? ?org.slf4j.impl.StaticLoggerBinder盲赊,這個(gè)類(lèi)的功能就是調(diào)用具體的日志庫(kù), 啟動(dòng)過(guò)程中的初始化主要是執(zhí)行init(new ContextInitializer(defaultLoggerContext).autoConfig()), debug如下
????繼續(xù)追蹤到 ch.qos.logback.classic.util.ContextInitializer的autoConfig(),
如下:
從debug過(guò)程中來(lái)看, logback 在啟動(dòng)時(shí)沿腰,根據(jù)以下步驟尋找配置文件:
1.在classpath 中尋找 logback-test.xml文件;
2.如果找不到logbck-test.xml, 則繼續(xù)查找logback.groovy文件;
3.如果找不到 logback.groovy,則在 classpath 中尋找 logback.xml文件.
4.如果上述的文件都找不到突诬,則 logback 會(huì)使用 JDK 的 SPI 機(jī)制查找 META-INF/services/ch.qos.logback.classic.spi.Configurator 中的 logback 配置實(shí)現(xiàn)類(lèi),這個(gè)實(shí)現(xiàn)類(lèi)必須實(shí)現(xiàn) Configuration 接口芜繁,使用它的實(shí)現(xiàn)來(lái)進(jìn)行配置
5.如果上述操作都不成功旺隙,logback 就會(huì)使用它自帶的 BasicConfigurator 來(lái)配置,并將日志輸出到 console
綜上: springmvc項(xiàng)目在加載logback配置文件的過(guò)程中, 只會(huì)加載logback-test.xml, logback.groovy以及l(fā)ogback.xml文件 ,其他命名文件則被忽略
解決方案
????將logback-spring.xml文件重命名為logback.xml文件即可.
拓展
?logback-spring.xml文件何時(shí)生效呢?---在springboot項(xiàng)目中才會(huì)生效
????SpringBoot中是使用LoggingApplicationListener這個(gè)類(lèi)來(lái)進(jìn)行日志系統(tǒng)的初始化的骏令。LoggingApplicationListener實(shí)現(xiàn)了ApplicationListener接口, 接下來(lái)看看onApplicationEvent()的執(zhí)行過(guò)程:
????從源碼中可以看出, logback加載日志配置文件的過(guò)程,是先加載了標(biāo)準(zhǔn)的日志配置文件(即logback-test.xml, logback.groovy以及l(fā)ogback.xml,logback-test.groovy文件), 再對(duì)標(biāo)準(zhǔn)的日志配置文件名進(jìn)行"-spring."的拼接, 從而實(shí)現(xiàn)了日志配置文件名的拓展.
結(jié)論
????在springmvc項(xiàng)目中,針對(duì)日志配置文件, 只加載默認(rèn)命名的logback-test.xml, logback.groovy以及l(fā)ogback.xml文件;
????而在springboot項(xiàng)目中, 允許并推薦對(duì)日志配置文件名進(jìn)行拓展, 即在文件名后拼接"-spring".