Java平臺下存在很多日志框架,比如JUL(java.util.logging),JCL(Apache Commons Logging),Log4j,Log4j2,Logback,SLF4j,jboss-logging等。
java平臺下日志框架的發(fā)展,經(jīng)歷了具體的日志實(shí)現(xiàn),后來發(fā)展為日志門面 日志實(shí)現(xiàn)。
java日志
當(dāng)我們在開發(fā)的時候,應(yīng)該使用日志門面提供的api,而不是直接使用具體的日志實(shí)現(xiàn)。
打個比方,如果我們使用slf4j log4j這套組合,那么配置提供log4j的配置(比如log4j.xml),使用slf4j提供的日志api即可;也就是說,每個日志實(shí)現(xiàn)框架都有自己的日志配置文件,即便使用日志門面后,依然要提供各自的配置文件。(也就是日志門面只是實(shí)現(xiàn)了api的適配,而沒有進(jìn)行日志配置的統(tǒng)一規(guī)范)
當(dāng)前最流行的日志門面是slf4j了,我們就以這個為例來具體分析下,主要進(jìn)行2點(diǎn)分析:
第一:slf4j是如何對各個日志實(shí)現(xiàn)進(jìn)行適配?
第二:如何在項(xiàng)目中進(jìn)行日志的統(tǒng)一使用?
slf4j logback
slf4j log4j
上面2個圖分別是:slf4j logback和slf4j log4j這2套日志組合的方式圖解說明。
首先,我們來說第一個問題,sl4j如何和其他日志實(shí)現(xiàn)框架適配的問題。
很簡單,我們只需要看圖中的左側(cè)部分,提供相應(yīng)的jar即可(有的除了具體的日志實(shí)現(xiàn)外,還需要提供額外的適配jar包)。
其次,我們要注意一個問題,由于在項(xiàng)目開發(fā)中,不可避免需要引入其他依賴,比如Spring默認(rèn)使用的是commons-logging(即JCL),而Hibernate默認(rèn)使用的是jboss-logging,那么問題就來了,我們?nèi)绾谓y(tǒng)一日志記錄的方式?
上圖中的右側(cè)部分就揭示了方法,打個比方,如果我們依賴Spring,雖然Spring默認(rèn)使用的是JCL,要想在項(xiàng)目中統(tǒng)一使用slf4j logback的話,很簡單,我們先排除掉 JCL的依賴,然后再引入jcl-over-slf4j.jar的依賴即可。(其實(shí)就是在偷梁換柱,jcl-over-slf4j.jar和JCL在包名/類名/方法名上完全一致,只不過jcl-over-slf4j在內(nèi)部調(diào)用的是slf4j的api而已,這樣既可以避免Spring報(bào)錯,又可以將Spring日志記錄方式加以改變!)
SpringBoot能自動適配所有的日志,而且底層使用的是slf4j logback的方式記錄日志,引入其他框架的時候,只需要把這個框架依賴的日志框架排除掉即可。
SpringBoot很聰明,它已經(jīng)把一些日志適配依賴都引入進(jìn)來了,下面我們具體分析。
springboot日志依賴
我想通過上圖的日志依賴關(guān)系,你就會明白springboot的良苦用心了!
上文說過Spring默認(rèn)的日志依賴是JCL,而SpringBoot肯定是依賴Spring的,根據(jù)上文理論,自然是需要排除掉JCL的依賴的,我們來看下面的:
springboot依賴spring
spring已經(jīng)排除掉JCL依賴
關(guān)于SpringBoot日志的使用上,主要指出下面幾點(diǎn):
第一:全局的一些常用配置,如格式/路徑/級別
第二:使用@Slf4j來進(jìn)行日志處理
第三:日志的profile功能
第四:切換日志框架
在application.properties中進(jìn)行日志配置
指定日志配置文件路徑 logging.config=classpath:logback.xml
采用logging.path的方式指定日志路徑
指定日志級別,要么在application.properties中直接指定:
logging.level.x.y.z=info
要么在logback.xml中配置。
關(guān)于日志的具體配置,這里不詳細(xì)介紹,網(wǎng)上有很多資料大家可以參考。
日志的具體使用,相信大家很清楚,基本上就是先得到log對象:
private final Logger logger = LoggerFactory.getLogger(XXX.class);
不過為了簡化,lombok給我們提供了注解進(jìn)行日志輸出。(需要idea有l(wèi)ombok的插件,還有需要lombok的依賴)
lombok支持
提供注解,直接使用log
下面我們再來簡單談一下日志的profile功能,要想支持profile功能也很簡單,比如不要在叫l(wèi)ogback.xml,而是logback-spring.xml,這樣日志配置將由springboot來進(jìn)行處理,就可以使用到profile功能。
logback-spring.xml
最后,我們再說一下,如果不想使用springboot默認(rèn)支持的slf4j logback的方式,而是slf4j xxx呢?
很簡單,根據(jù)上文理論,第一,排除依賴(logback);第二,加入依賴(log4j);第三,加入具體日志配置即可(log4j.xml)。