我在使用springboot時,當代碼有問題時,發現控制檯打印下面信息:html
Connected to the target VM, address: '127.0.0.1:42091', transport: 'socket' log4j:WARN No appenders could be found for logger (org.springframework.boot.devtools.settings.DevToolsSettings). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.0.6.RELEASE) 2018-10-25 10:10:21.425 INFO 102158 --- [ restartedMain] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2018-10-25 10:10:21.427 INFO 102158 --- [ restartedMain] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.34 2018-10-25 10:10:21.444 INFO 102158 --- [ost-startStop-1] o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib] 2018-10-25 10:10:21.590 INFO 102158 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2018-10-25 10:10:24.522 INFO 102158 --- [ restartedMain] o.apache.catalina.core.StandardService : Stopping service [Tomcat] Disconnected from the target VM, address: '127.0.0.1:42091', transport: 'socket' Process finished with exit code 0
WTF?沒有錯誤信息怎麼解決問題? 各類搜索,總之就是代碼有問題,本身檢查把...java
好吧,直接debug把spring
內嵌tomcat的入口類是org.apache.catalina.core.StandardService
數據庫
//TODO 後面補上過程apache
最終找到org.springframework.context.support.AbstractApplicationContext
定位方法refresh()
api
if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); }
debug能夠正常進入,而後就看到咱們但願看到的 ex了tomcat
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fabricApiController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'fabricTemplate': Injection of resource dependencies failed; nested exception is org.springframework.boot.context.properties.ConfigurationPropertiesBindException: Error creating bean with name 'fabricConfiguration': Could not bind properties to 'FabricConfiguration' : prefix=blockchain, ignoreInvalidFields=false, ignoreUnknownFields=true; nested exception is org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'blockchain.channel-peers' to java.util.List<com.smy.bc.fabric.core.configuration.FabricConfiguration$EndPoint>
問題發現了,解決本身代碼問題,而後從新啓動,正常! 萬事大吉?錯,這纔開始springboot
上面咱們簡單解決了問題,可是根源沒有解決! 要說解決方案把當前流行的日誌體系簡單說一遍 下面整理的來源網絡: 常見的日誌框架,注意不是具體解決方案 1 Commons-logging: apache 最先提供的日誌的門面接口。避免和具體的日誌方案直接耦合。相似於JDBC的api接口,具體的的JDBC driver實現由各數據庫提供商實現。經過統一接口解耦,不過其內部也實現了一些簡單日誌方案 2 Slf4j: 全稱爲Simple Logging Facade for JAVA:java簡單日誌門面。是對不一樣日誌框架提供的一個門面封裝。能夠在部署的時候不修改任何配置便可接入一種日誌實現方案。和commons-loging應該有同樣的初衷。 常見的日誌實現: log4j logback jdk-logging 詳細優缺點不是本文重點,請自行搜索。
接着分析上面的問題,Commons-logging 是tomcat默認的日誌系統(apache自家東西得支持),具體的日誌實現,根據系統已存在日誌系統選擇。 簡單列舉如下log的實現: org.apache.commons.logging.Log | org.apache.commons.logging.impl.SimpleLog org.apache.commons.logging.impl.NoOpLog org.apache.commons.logging.impl.Log4JLogger org.apache.commons.logging.impl.SLF4JLog org.apache.commons.logging.impl.Jdk14Logger網絡
springboot 默認使用的是logback日誌實現,問題就出如今這裏了!!!common-logs並無logback的實現!app
根據maven依賴,咱們看到log4j和logback的包都被引入了,而後tomcat之能選擇的是log4j,springboot使用的是logback。 log4j和logback只見缺乏一個橋樑,正是缺乏的這個橋樑,致使springboot只能輸出logback!!!
中間的橋樑就是下面這個依賴
<dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> </dependency>
這個依賴能夠將log4j輸出到slf4j,從而從sl4j輸出。
總結: 總結一下,已經搞明白是slf4j/common-logs <> log4j和logback的恩怨情仇
第一種解決方式:根據日誌定位問題,而後採用加法處理,增長jcl-over-slf4j,打通slf4j和common-logs通道
第二種解決方式:解決衝突,一山不容二虎,排除掉slf4j,common-logs任意一方,spring使用slf4j,那能夠排除調common-logs
從項目優化的角度看,第二種更優,能夠減小沒必要要的依賴。
若是日誌出現問題,那就是日誌體系發生衝突了,能夠參考這個思路,處理項目中日誌異常問題。