<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Java帝國在誕生之初就提供了集合、執行緒、IO、網路等常用功能,從C和C++領地那裡吸引了大量程式設計師過來加盟,但是卻有意無意地忽略了一個重要的功能: 輸出紀錄檔。
對於這一點,IO大臣其實非常清楚, 紀錄檔是個很重要的東西, 因為程式執行起來以後, 基本上就是一個黑盒子,如果程式的行為和預料的不一致,那就是出現Bug了,如何去定位這個Bug 呢?
臣民們能用的工具有兩個,第一個就是單步偵錯,一步步地跟蹤,檢視程式碼中變數的值, 這種辦法費時費力, 並且只能在程式設計師的機器上才能用。
第二種就是在特定的地方列印紀錄檔, 通過紀錄檔的輸出,幫助快速定位。尤其是當程式碼在生產環境上跑起來以後, 紀錄檔資訊更是必不可少,要不然出了狀況兩眼一抹黑,上哪兒找問題去? 總不能讓臣民們把自己變成一個執行緒進入系統來執行吧?
但是IO大臣也有自己的小算盤: 紀錄檔嘛, 用我的System.out.println(…..) 不就可以了?! 我還提供了System.err.println不是?
在IO大臣的阻撓下, 從帝國的第一代國王到第三代國王, 都沒有在JDK中提供紀錄檔相關的工具包, 臣民們只好忍受著去使用System.out.println去輸出紀錄檔,把所有的資訊都輸出到控制檯, 讓那裡變成一堆垃圾。
張家村的電子商務系統也不能倖免,自然也遇到了紀錄檔的問題。經驗豐富的老村長已經煩透了System.out.println所輸出的大量難於理解的無用資訊,看著村民民整天苦逼地和這些System.out做鬥爭,他找來了小張,命令他設計一個通用的處理紀錄檔的系統。
小張在訊息佇列和JMS的設計上花了不少功夫, 積累了豐富的經驗,從那以後一直都是實現業務程式碼,一直都是CRUD, 張二妮整天笑話自己是HTML填空人員,這一回一定要讓她看看自己的設計功力!
老村長給小張下達的需求是這樣的:
1. 紀錄檔訊息除了能列印到控制檯, 還可以輸出到檔案,甚至可以通過郵件傳送出去(例如生成環境出錯的訊息)
2. 紀錄檔內容應該可以做格式化, 例如變成純文字,XML, HTML格式等等
3. 對於不同的Java class,不同的 package , 還有不同級別的紀錄檔,應該可以靈活地輸出到不同的檔案中。
4. 能對紀錄檔進行分級, 有些紀錄檔純屬debug , 在本機或者測試環境使用, 方便程式設計師的偵錯, 生產環境完全不需要。有些紀錄檔是描述錯誤(error)的, 在生產環境下出錯的話必須要記錄下來,幫助後續的分析。
小張仔細看了看,拍著胸脯對老村長說:“沒問題, 明天一定讓您老看到結果。”
老村長走了以後,小張開始分析需求, 祭出“物件導向設計大法”,試圖從村長的需求中抽象出一點概念。
首先要記錄紀錄檔,肯定需要一個類來表達紀錄檔的概念,這個類至少應該有兩個屬性,一個是時間戳,一個是訊息本身,把它叫做 LoggingEvent 吧,記錄紀錄檔就像記錄一個事件嘛。
其次是紀錄檔可以輸出到不同的地方,控制檯、檔案、郵件等等, 這個可以抽象一下,不就是寫到不同的目的地嗎? 可以叫做LogDestination?
嗯, 還是簡單一點,叫做 Appender 吧, 暗含了可以不斷追加紀錄檔的意思。
至於第二條的紀錄檔內容可以格式化,完全可以比葫蘆畫瓢, 定義一個Formatter介面去格式化訊息。
對了, Appender 應該參照Formatter ,這樣以來就可以對LoggingEvent記錄格式化以後再傳送。
第三條需求把小張給難住了,不同的class, package 輸出的目的地不同? “目的地”這個概念是由Appender來表達的, 難道讓不同的class, package 和Appender關聯? 不不, 不能這樣 !
還需要一個新的概念 , 這個概念是什麼?
從使用者角度想一下, 村民們要想獲取紀錄檔,必須得先獲取個什麼東西,這個東西是不是可以稱為Logger啊? 靈感的火花就閃了那麼一下就被小張抓住了: 獲取Logger的時候要傳入類名或者包名!
class, package就區分開了, 然後讓Logger 和Appender關聯,靈活地設定紀錄檔的目的地, 並且一個Logger可以擁有多個Appender,同一條紀錄檔訊息可以輸出到多個地方, 完美!
小張迅速地畫出了核心類的類圖:
還算漂亮,小張陶醉著自我欣賞了一下。
再接再厲, 把第四條需求也設計一下,紀錄檔要分級,這個簡單, 定義一個Priority的類,裡邊定義5個常數DEBUG, INFO, WARN, ERROR, FATAL, 表示5個不同的級別就OK了。當然這我5個級別有高低之分, DEBUG級別最低, FATAL級別最高。
還可以給Logger增加一些輔助程式設計的方法,如Logger.debug(….) , Logger.info(…) , Logger.warn(…) 等等, 這樣村民們將來就可以輕鬆地輸出各種級別的紀錄檔了。
等一下, 老村長還說過“對於所有的ERROR級別的紀錄檔,都輸出到 errors.log檔案中” 類似這樣的需求, 好像給忽略了。
這也好辦嘛, 只要在Appender上增加一個屬性,就叫做Priority, 如果使用者要輸出的紀錄檔是DEBUG級別, 但是有個FileAppender的Priority是 ERROR級別,那這個紀錄檔就不用在這個FileAppender中輸出了 ,因為ERROR級別比DEBUG級別高嘛。
同理, 在Logger類上也可以增加一個Priority的屬性,使用者可以去設定, 如果一個Logger的Priority是ERROR, 而使用者呼叫了這個Logger的debug方法, 那這個debug 的訊息也不會輸出。
小張全心全意地投入到設計當中,一看時間, 都快半夜了, 趕緊休息, 明天向村長彙報去。
第二天, 小張給老村長展示了自己設計的LoggerEvent, Logger , Appender, Formatter, Priority 等類和介面, 老村長捻著鬍子滿意地點點頭:“不錯不錯,與上一次相比有巨大的進步。你知不知道我在需求中其實給了你引導?”
“引導? 什麼引導? ”
“就是讓你朝著正交的方向去努力啊”
“正交? ”
“如果你把Logger, Appender, Formatter看成座標系中的X軸,Y軸,Z軸, 你看看,這三者是不是可以獨立變化而不互相影響啊?”
“我賽,果然如此,我可以任意擴充套件Appender介面而影響不到Logger和Formatter, 無論有多少個Logger 都影響不了Appender和Formatter , 這就是正交了?”
“是啊,當你從系統中提取出正交的概念的時候,那就威力無比了,因為變化被封裝在了一個維度上,你可以把這些概念任意組合,而不會變成義大利麵條似的程式碼。 ”
聽到村長做了理論的昇華, 小張興奮得直搓手。
“好吧,你把這個設計實現了吧,對了,你打算叫什麼名字? ” 村長問道
“我打算把他叫做Log4j , 意思是Log for Java”
“不錯,就這麼定了吧”
小張又花了兩個月的時間把Log4j 開發了出來, 由於Log4j有著良好的設計,優異的效能, 不僅僅是張家村的人在用, Java帝國的很多村鎮、部落都愛上了它。
後來張家村把Log4j 在Apache部落開源了, 這下子吸引了無數的人無償幫助測試它,擴充套件它,改進它, 很快就成了帝國最流行的紀錄檔工具。
張家村建議帝國把Log4j 納入到JDK 中, 帝國那效率低下的官僚機構竟然拒絕了。 訊息傳到了IO大臣的耳朵裡,他不由的扼腕嘆息: 唉,失去了一次極好的招安機會啊。 現在唯一的辦法就是趕緊上奏皇上,在官方也提供一套,爭取讓臣民們使用官方版本。
到了第四代國王(JDK1.4),臣民們終於看到了帝國提供的java.util.logging包,也是用來記錄紀錄檔的,並且其中的核心概念Logger, Formatter, Handler 和 Log4j非常相似,只是為時已晚, Log4j早已深入人心了, 不可撼動了。
Log4j 在Apache開源以後, 小張也逐漸地有點落寞,他閒不住又寫了一個工具,叫做logback, 有了之前的經驗,這logback 比log4j 還要快。
如今的紀錄檔世界有了很多的選擇 ,除了java.util.logging, log4j 之外,還有logback,tinylog 等其他工具。
小張想了想, 這麼多紀錄檔工具,使用者如果想切換了怎麼辦?不想用log4j了,能換到logback嗎?
我還是提供一個抽象層吧, 使用者用這個抽象層的API來寫紀錄檔, 底層具體用什麼紀錄檔工具不用關心,這樣就可以移植了。
小張把這抽象層就叫做Simple Logging Facade for Java,簡稱SLF4J。
對於Log4j , JDK logging, tinylog 等工具, 需要一個適配層, 把SLF4J 的API轉化成具體工具的呼叫介面。
由於Logback這個工具也是出自小張之手, 直接實現了SLF4J的API,所以連適配層都不需要了, 用起來速度飛快,效率最高,SLFJ4+Logback 成為了很多人的最愛, 大有超越Apache Common Logging + Log4j 之勢。
後記: 本文主要想講一下紀錄檔工具的歷史和現狀, 尤其是Log4j核心的設計理念。
文中的小張其實就是Ceki Gülcü,他開發了Log4j , logback,以及slfj4, 為Java的紀錄檔事業做出了卓越的貢獻。
到此這篇關於Java中 SLF4J和Logback和Log4j和Logging的區別與聯絡的文章就介紹到這了,更多相關Java SLF4J,Logback,Log4j,Logging內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45