前言
《【SpringBoot專(zhuān)題】快速體驗(yàn)》
《【SpringBoot專(zhuān)題】多環(huán)境配置及swagger》
本篇是【SpringBoot專(zhuān)題】系列的第三篇,將介紹SpringBoot對(duì)日志的支持淫半,講解Java平臺(tái)下日志的那些事,徹底揭開(kāi)日志框架在使用過(guò)程中的那些坑~
日志框架漫談
Java平臺(tái)下存在很多日志框架矢赁,比如JUL(java.util.logging)排嫌,JCL(Apache Commons Logging)对粪,Log4j,Log4j2箱靴,Logback谱姓,SLF4j,jboss-logging等刨晴。
java平臺(tái)下日志框架的發(fā)展屉来,經(jīng)歷了具體的日志實(shí)現(xiàn),后來(lái)發(fā)展為日志門(mén)面+日志實(shí)現(xiàn)狈癞。
當(dāng)我們?cè)陂_(kāi)發(fā)的時(shí)候茄靠,應(yīng)該使用日志門(mén)面提供的api,而不是直接使用具體的日志實(shí)現(xiàn)蝶桶。
打個(gè)比方慨绳,如果我們使用slf4j+log4j這套組合,那么配置提供log4j的配置(比如log4j.xml),使用slf4j提供的日志api即可脐雪;也就是說(shuō)厌小,每個(gè)日志實(shí)現(xiàn)框架都有自己的日志配置文件,即便使用日志門(mén)面后战秋,依然要提供各自的配置文件璧亚。(也就是日志門(mén)面只是實(shí)現(xiàn)了api的適配,而沒(méi)有進(jìn)行日志配置的統(tǒng)一規(guī)范)
當(dāng)前最流行的日志門(mén)面是slf4j了脂信,我們就以這個(gè)為例來(lái)具體分析下癣蟋,主要進(jìn)行2點(diǎn)分析:
第一:slf4j是如何對(duì)各個(gè)日志實(shí)現(xiàn)進(jìn)行適配?
第二:如何在項(xiàng)目中進(jìn)行日志的統(tǒng)一使用狰闪?
上面2個(gè)圖分別是:slf4j+logback和slf4j+log4j這2套日志組合的方式圖解說(shuō)明疯搅。
首先,我們來(lái)說(shuō)第一個(gè)問(wèn)題埋泵,sl4j如何和其他日志實(shí)現(xiàn)框架適配的問(wèn)題幔欧。
很簡(jiǎn)單,我們只需要看圖中的左側(cè)部分丽声,提供相應(yīng)的jar即可(有的除了具體的日志實(shí)現(xiàn)外琐馆,還需要提供額外的適配jar包)。
其次恒序,我們要注意一個(gè)問(wèn)題,由于在項(xiàng)目開(kāi)發(fā)中谁撼,不可避免需要引入其他依賴(lài)歧胁,比如Spring默認(rèn)使用的是commons-logging(即JCL),而Hibernate默認(rèn)使用的是jboss-logging,那么問(wèn)題就來(lái)了厉碟,我們?nèi)绾谓y(tǒng)一日志記錄的方式喊巍?
上圖中的右側(cè)部分就揭示了方法,打個(gè)比方箍鼓,如果我們依賴(lài)Spring崭参,雖然Spring默認(rèn)使用的是JCL,要想在項(xiàng)目中統(tǒng)一使用slf4j+logback的話(huà),很簡(jiǎn)單款咖,我們先排除掉 JCL的依賴(lài)何暮,然后再引入jcl-over-slf4j.jar的依賴(lài)即可。(其實(shí)就是在偷梁換柱铐殃,jcl-over-slf4j.jar和JCL在包名/類(lèi)名/方法名上完全一致海洼,只不過(guò)jcl-over-slf4j在內(nèi)部調(diào)用的是slf4j的api而已,這樣既可以避免Spring報(bào)錯(cuò)富腊,又可以將Spring日志記錄方式加以改變;捣辍)
看SpringBoot如何對(duì)日志進(jìn)行統(tǒng)一處理
SpringBoot能自動(dòng)適配所有的日志,而且底層使用的是slf4j+logback的方式記錄日志,引入其他框架的時(shí)候是整,只需要把這個(gè)框架依賴(lài)的日志框架排除掉即可肖揣。
SpringBoot很聰明,它已經(jīng)把一些日志適配依賴(lài)都引入進(jìn)來(lái)了浮入,下面我們具體分析龙优。
我想通過(guò)上圖的日志依賴(lài)關(guān)系,你就會(huì)明白springboot的良苦用心了舵盈!
上文說(shuō)過(guò)Spring默認(rèn)的日志依賴(lài)是JCL陋率,而SpringBoot肯定是依賴(lài)Spring的,根據(jù)上文理論秽晚,自然是需要排除掉JCL的依賴(lài)的瓦糟,我們來(lái)看下面的:
SpringBoot日志使用
關(guān)于SpringBoot日志的使用上,主要指出下面幾點(diǎn):
第一:全局的一些常用配置赴蝇,如格式/路徑/級(jí)別
第二:使用@Slf4j來(lái)進(jìn)行日志處理
第三:日志的profile功能
第四:切換日志框架
指定日志配置文件路徑 logging.config=classpath:logback.xml?
采用logging.path的方式指定日志路徑
指定日志級(jí)別菩浙,要么在application.properties中直接指定:
logging.level.x.y.z=info
要么在logback.xml中配置。
關(guān)于日志的具體配置句伶,這里不詳細(xì)介紹劲蜻,網(wǎng)上有很多資料大家可以參考。
日志的具體使用考余,相信大家很清楚先嬉,基本上就是先得到log對(duì)象:
private? final Logger logger = LoggerFactory.getLogger(XXX.class);
不過(guò)為了簡(jiǎn)化,lombok給我們提供了注解進(jìn)行日志輸出楚堤。(需要idea有l(wèi)ombok的插件疫蔓,還有需要lombok的依賴(lài))
下面我們?cè)賮?lái)簡(jiǎn)單談一下日志的profile功能身冬,要想支持profile功能也很簡(jiǎn)單衅胀,比如不要在叫l(wèi)ogback.xml,而是logback-spring.xml酥筝,這樣日志配置將由springboot來(lái)進(jìn)行處理滚躯,就可以使用到profile功能。
最后嘿歌,我們?cè)僬f(shuō)一下掸掏,如果不想使用springboot默認(rèn)支持的slf4j+logback的方式,而是slf4j+xxx呢宙帝?
很簡(jiǎn)單阅束,根據(jù)上文理論,第一茄唐,排除依賴(lài)(logback)息裸;第二蝇更,加入依賴(lài)(log4j);第三呼盆,加入具體日志配置即可(log4j.xml)年扩。
結(jié)束語(yǔ)
好了,到這里访圃,我們就以SpringBoot為切入點(diǎn)厨幻,對(duì)整個(gè)Java平臺(tái)的日志進(jìn)行了一個(gè)分析,相信以后在開(kāi)發(fā)過(guò)程中遇到日志的有關(guān)問(wèn)題腿时,能夠心中有數(shù)~
create by zhangfengzhe
2018-08-18