slf4j、log4j究抓、log4j2猾担、logback到底用哪些jar

前言

SparkStreaming用久了,打算學(xué)習(xí)一下Flink刺下,就從官網(wǎng)下載了Flink 1.11绑嘹,打算搞一個(gè)客戶端,將程序提交在yarn上橘茉。因?yàn)镕link從1.7之后就不再提供Hadoop的依賴工腋,所以很多依賴就要自己下載,于是各種ClassNotFoundException畅卓,其中以log*.class為首的格外猖狂擅腰,可能是因?yàn)閒link和Hadoop的日志實(shí)現(xiàn)有點(diǎn)區(qū)別,就一直哐哐哐報(bào)錯(cuò)翁潘,slf4j惕鼓、log4j、logback各種jar包十幾個(gè)唐础,百度好久也沒(méi)搞清各個(gè)jar有什么區(qū)別箱歧,用在何處矾飞,就打算自己總結(jié)一下。

log發(fā)展歷史

Long long Ago呀邢,和我剛學(xué)Java的時(shí)候一樣洒沦,都是用System.out.println來(lái)看看程序輸出的結(jié)果是否符合自己的預(yù)期。后來(lái)發(fā)現(xiàn)這種方式真的有點(diǎn)low价淌,從JDK1.4開(kāi)始提供java.until.logging申眼,后來(lái)大佬發(fā)現(xiàn)JUL太難用了,就自己手?jǐn)]了個(gè)log4j蝉衣,后來(lái)log4j發(fā)現(xiàn)安全漏洞括尸,加上代碼結(jié)構(gòu)問(wèn)題難以維護(hù),于是從1.2就停止更新log4j病毡,并又重新手?jǐn)]了個(gè)log4j2濒翻,后來(lái)這個(gè)大佬手?jǐn)]了一個(gè)性能更高、功能更全的logback啦膜,從此有送,這個(gè)大佬構(gòu)建了log的世界,也創(chuàng)造了最常見(jiàn)的日志框架:log4j僧家、log4j2雀摘、logback。

SLF4J( Simple Logging Facade for Java )

目前已經(jīng)提及的四個(gè)日志框架八拱,如果我們想用來(lái)記錄日志的話阵赠,需要完成它們必要的配置,并且在代碼中獲取Logger肌稻,打印日志豌注。
引入代碼如下:

// 使用log4j,需要log4j.jar
import org.apache.log4j.Logger;
Logger logger_log4j = Logger.getLogger(Test.class);
logger_log4j.info("Hello World!");

// 使用log4j2灯萍,需要log4j-api.jar轧铁、log4j-core.jar
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
Logger logger_log4j2 = LogManager.getLogger(Test.class);
logger_log4j2.info("Hello World!");

// logback,需要logback-classic.jar旦棉、logback-core.jar
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
Logger logger_logback = new LoggerContext().getLogger(Test.class);
logger_logback.info("Hello World!");

// java.until.logging齿风,簡(jiǎn)稱(chēng)jul
import java.util.logging.Logger;
Logger logger_jul = Logger.getLogger("java.Test");

從上面不難看出,使用不同的日志框架绑洛,就要引入不同的jar包救斑,使用不同的代碼獲取Logger。假設(shè)一個(gè)項(xiàng)目在漫長(zhǎng)的升級(jí)過(guò)程中真屯,想從jul升級(jí)到logback脸候,還得需要修改代碼。如果100個(gè)class中使用了jul,就得修改100個(gè)地方运沦,這是多么一個(gè)繁瑣的工作惯吕。于是Apache Commons Logging出現(xiàn)了朽褪。
Common-logging提供了一個(gè)日志入口,稱(chēng)作"門(mén)面日志",即它不負(fù)責(zé)寫(xiě)日志缤沦,而是提供用一個(gè)統(tǒng)一的接口寺枉,通過(guò)jar來(lái)決定使用的日志框架括蝠,這樣就不要再更換框架的時(shí)候再修改代碼了来候。后來(lái)開(kāi)發(fā)了log4j的大佬在嫌棄Common-logging難用之后又開(kāi)發(fā)了同樣功能的slf4j,今天就拿slf4j講述門(mén)面日志左敌。
門(mén)面日志和設(shè)計(jì)模式中的外觀模式如出一轍瘾蛋,就是為子系統(tǒng)提供統(tǒng)一的入口,封裝子系統(tǒng)的復(fù)雜性矫限,便于客戶端調(diào)用哺哼。slf4j就像是菜鳥(niǎo)驛站,本身沒(méi)有快遞服務(wù)奇唤,但是提供順豐幸斥、中通等快遞服務(wù)匹摇,至于你想用順豐還是用中通咬扇,完全取決于你的想法。

使用slf4j的代碼如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger logger = LoggerFactory.getLogger(Test.class);
logger.info("Hello World!")

這行代碼就像是你拿了個(gè)要寄出的東西(logger)在菜鳥(niǎo)驛站里廊勃, 思考到底用哪家快遞懈贺?A minute later...決定用順豐(logback),就填了順豐的快遞單(放入logback.jar)坡垫,但是你看微信余額還有10塊梭灿,還是用中通(log4j)吧,于是你就退了順豐的單子(移除logback.jar)冰悠,填了中通的快遞單(放入log4j.jar)堡妒。
那么slf4j如何決定使用哪個(gè)框架日志呢?如slf4j官方圖所示:

在這里插入圖片描述

這就是slf4j和其他框架的組合溉卓,使用slf4j需要首先導(dǎo)入slf4j-api.jar皮迟,和log4j配合,你就要導(dǎo)入log4j.jar桑寨,以及他們之間的橋接包slf4j-log412.jar伏尼。這個(gè)官方圖美中不足的地方是,沒(méi)有l(wèi)og4j2的配合方式尉尾,和log4j2配合需要導(dǎo)入橋接包log4j-slf4j-impl.jar和log4j2的log4j-api.jar爆阶、log4j-core.jar。logback只需要導(dǎo)入logback-classiclogback-core.jar即可,不需要橋接包辨图。

什么是橋接包班套,為什么logback沒(méi)有

先讓來(lái)讓我們看看slf4j從LoggerFactory.getLogger()開(kāi)始,到底干了什么徒役。
流程圖如下:


在這里插入圖片描述

原理就是就是讓ClassLoader從classpath(依賴的jar)中找到StaticLoggerBinder這個(gè)類(lèi)孽尽,然后利用他來(lái)返回log4j、logback等Logger忧勿,然后實(shí)現(xiàn)打印日志杉女。
所謂的橋接包,就是實(shí)現(xiàn)了StaticLoggerBinder類(lèi)來(lái)連接slf4j和日志框架鸳吸。因?yàn)閘og4j和log4j2剛開(kāi)始沒(méi)有StaticLoggerBinder這個(gè)類(lèi)熏挎,為了不改變程序結(jié)構(gòu),于是寫(xiě)了一個(gè)新的包來(lái)實(shí)現(xiàn)StaticLoggerBinder晌砾。而logback出現(xiàn)slf4j之后坎拐,所以就在logback中實(shí)現(xiàn)了StaticLoggerBinder,所以就不需要橋接包养匈。
StaticLoggerBinder大致實(shí)現(xiàn)了本文第一段代碼里面的功能哼勇,各自的StaticLoggerBinder為slf4j提供各自的Logger,再提供給用戶呕乎。
log4j和log4j2橋接包及l(fā)ogback結(jié)構(gòu)如圖所示积担,里面都有StaticLoggerBinder類(lèi)。

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述


使用總結(jié)

"Class path contains multiple SLF4J bindings."
在使用slf4j的時(shí)候會(huì)遇到以上的報(bào)告信息猬仁。我也曾遇到過(guò)web服務(wù)因?yàn)閟lf4j問(wèn)題啟動(dòng)失敗帝璧。究其根本是因?yàn)閘ogback-classic、log4j-slf4j-impl湿刽、slf4j-log412的烁、slf4j-jdk這些jar不能同時(shí)存在。他們都實(shí)現(xiàn)了StaticLoggerBinder類(lèi)而導(dǎo)致沖突诈闺,slf4j無(wú)法確定到底用哪個(gè)日志框架渴庆。

結(jié)語(yǔ)

這是自己從官網(wǎng)上和自己調(diào)試的代碼的一些總結(jié),希望對(duì)大家了解slf4j及其應(yīng)用有幫助雅镊,若發(fā)現(xiàn)其中不足的地方襟雷,還望指出,共同進(jìn)步漓穿。共勉`途!晃危!


本文由博客群發(fā)一文多發(fā)等運(yùn)營(yíng)工具平臺(tái) OpenWrite 發(fā)布

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末叙赚,一起剝皮案震驚了整個(gè)濱河市老客,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌震叮,老刑警劉巖胧砰,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異苇瓣,居然都是意外死亡尉间,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)击罪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哲嘲,“玉大人,你說(shuō)我怎么就攤上這事媳禁∶吒保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵竣稽,是天一觀的道長(zhǎng)囱怕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)毫别,這世上最難降的妖魔是什么娃弓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮岛宦,結(jié)果婚禮上台丛,老公的妹妹穿的比我還像新娘。我一直安慰自己恋博,他們只是感情好齐佳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布私恬。 她就那樣靜靜地躺著债沮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪本鸣。 梳的紋絲不亂的頭發(fā)上疫衩,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音荣德,去河邊找鬼闷煤。 笑死,一個(gè)胖子當(dāng)著我的面吹牛涮瞻,可吹牛的內(nèi)容都是我干的鲤拿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼署咽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼近顷!你這毒婦竟也來(lái)了生音?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤窒升,失蹤者是張志新(化名)和其女友劉穎缀遍,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饱须,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域醇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蓉媳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片譬挚。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酪呻,靈堂內(nèi)的尸體忽然破棺而出殴瘦,到底是詐尸還是另有隱情,我是刑警寧澤号杠,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布蚪腋,位于F島的核電站,受9級(jí)特大地震影響姨蟋,放射性物質(zhì)發(fā)生泄漏屉凯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一眼溶、第九天 我趴在偏房一處隱蔽的房頂上張望悠砚。 院中可真熱鬧,春花似錦堂飞、人聲如沸灌旧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枢泰。三九已至,卻和暖如春铝噩,著一層夾襖步出監(jiān)牢的瞬間衡蚂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工骏庸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毛甲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓具被,卻偏偏與公主長(zhǎng)得像玻募,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子一姿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355