精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個著名的日志系統是怎么設計出來的?

開發 后端 開發工具
Java帝國在誕生之初就提供了集合、線程、IO、網絡等常用功能,從C和C++領地那里吸引了大量程序員過來加盟,但是卻有意無意地忽略了一個重要的功能: 輸出日志。

前言

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 , 還有不同級別的日志,應該可以靈活地輸出到不同的文件中。

  • 例如對于com.foo 這個package,所有的日志都輸出到 foo.log 文件中
  • 對于com.bar 這個package ,所有文件都輸出到bar. log文件中
  • 對于所有的ERROR級別的日志,都輸出到 errors.log文件中

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 開發了出來, 由于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的日志事業做出了卓越的貢獻。

【本文為51CTO專欄作者“劉欣”的原創稿件,轉載請通過作者微信公眾號coderising獲取授權】

戳這里,看該作者更多好文

 

責任編輯:未麗燕 來源: 51CTO專欄
相關推薦

2019-04-17 09:36:39

日志系統HDFS

2018-07-17 15:15:33

任務調度系統

2024-04-24 10:38:22

2024-11-20 13:18:21

2019-06-17 10:33:52

程序員培訓班框架

2012-07-16 11:27:08

項目開發

2012-07-16 09:41:59

項目

2015-05-15 13:21:22

URL系統設計

2018-09-18 09:38:11

RPC遠程調用網絡通信

2022-01-28 09:03:35

PyechartsPython可視化

2022-03-17 15:34:47

printf日志

2010-05-10 13:21:12

Unix FreeBS

2022-10-14 08:29:18

DNS系統地址

2015-07-28 14:35:40

2019-06-27 09:50:49

高性能秒殺系統

2023-03-15 19:21:47

MySQLcount

2023-09-08 08:22:30

2023-09-08 08:10:48

2024-08-27 12:49:20

2020-09-02 07:22:17

JavaScript插件框架
點贊
收藏

51CTO技術棧公眾號

粉嫩虎白女毛片人体| 欧美日韩一区二区三区在线视频| 国产大学生自拍| 国产一区福利| 91久久奴性调教| 欧美日韩亚洲国产成人| 色窝窝无码一区二区三区| 日韩av一级片| 久久久亚洲影院| www.狠狠爱| 成人高潮a毛片免费观看网站| 日韩欧美成人免费视频| 性欧美18一19内谢| 青青免费在线视频| 国产高清一区日本| 国产精品av免费在线观看| 极品颜值美女露脸啪啪| 国产一区二区电影在线观看| 精品少妇一区二区| xxww在线观看| 免费观看亚洲| 一区二区免费看| 色之综合天天综合色天天棕色| 亚洲国产精品suv| 精品中文字幕一区二区小辣椒| 91国内产香蕉| 精品在线视频免费观看| 欧美电影三区| 亚洲精品一二区| 欧美激情一区二区三区p站| 欧美天堂一区二区| 黑人巨大精品欧美一区免费视频 | 日韩系列欧美系列| 日韩精品在线看| 又黄又色的网站| 九九九九九九精品任你躁| 欧洲一区二区三区在线| 久久婷婷五月综合色国产香蕉| 日本h片在线观看| 亚洲欧美综合在线精品| 亚洲精品一区二区三区樱花| 精品999视频| 91麻豆精品在线观看| 国模精品娜娜一二三区| 亚洲经典一区二区三区| 国产福利一区二区三区视频在线 | 欧美一区二区三区……| 久久精品国产亚洲av无码娇色| 久久久久国产精品| 北条麻妃99精品青青久久| 色撸撸在线视频| 日韩毛片视频| 啊v视频在线一区二区三区 | 欧美性xxxx极品hd欧美风情| 热99这里只有精品| 岛国在线视频网站| 性做久久久久久免费观看欧美| 97中文字幕在线| bl在线肉h视频大尺度| 亚洲aaa精品| 欧美 日韩 国产在线观看| 久久青草伊人| 色偷偷久久一区二区三区| 成年人小视频网站| 日本综合视频| 欧美一区二区视频网站| 在线成人精品视频| 精品人人人人| 亚洲色图25p| 99国产精品无码| 你懂的国产精品永久在线| 欧美精品久久久久久久久| 日韩精品久久久久久久酒店| 国产欧美一级| 国产精品第二页| 一区二区美女视频| 国产福利精品一区二区| 国产视频一区二区三区四区| 欧美人体大胆444www| 国产精品伦一区二区三级视频| 一区二区视频国产| 丁香花在线影院| 色先锋资源久久综合| 在线视频一二区| 国产精品中文字幕制服诱惑| 亚洲欧美日韩国产成人| 久久国产高清视频| 精品二区久久| 国产精品久久久久久久久免费| 国产欧美久久久精品免费| 成人福利视频在线| 色涩成人影视在线播放| 青草在线视频| 欧美午夜寂寞影院| 女同性αv亚洲女同志| 国产精品欧美三级在线观看| 久久精品国产2020观看福利| 日韩av在线播| 极品美女销魂一区二区三区免费| 国产在线精品一区二区三区| 午夜在线播放| 色综合久久综合网欧美综合网| 激情文学亚洲色图| 国产成人高清| 欧美日韩福利电影| 国产精品国产精品国产| 丰满白嫩尤物一区二区| 亚洲.欧美.日本.国产综合在线| 宅男网站在线免费观看| 在线亚洲精品福利网址导航| 亚洲国产欧美日韩在线| 成人黄色av| 97视频免费看| 国产高清在线免费| 日本一区二区三区高清不卡| 国产3p露脸普通话对白| 亚洲三级电影| 一二美女精品欧洲| 奇米影视第四色777| 国产精品自产自拍| 亚洲精品第一区二区三区| 中文字幕在线看片| 日韩免费视频一区| 国产成人av免费在线观看| 久久精品道一区二区三区| 99热最新在线| 黄色av电影在线观看| 色欲综合视频天天天| 亚洲国产精品第一页| 手机亚洲手机国产手机日韩| 国产不卡av在线免费观看| 欧美一区二区三区黄片| 国产精品国产精品国产专区不蜜 | 91嫩草国产丨精品入口麻豆| 91在线亚洲| 亚洲精品视频在线播放| 国产精品suv一区二区| 激情综合五月天| 亚洲成人在线视频网站| 欧洲一区二区三区精品| 国产丝袜高跟一区| www日韩精品| 成人av先锋影音| 大地资源网在线观看免费官网| 欧美综合影院| 日韩在线观看免费网站 | 日韩妆和欧美的一区二区| 成人观看网址| 亚洲精品v天堂中文字幕| 国产无遮挡又黄又爽| 成人免费毛片片v| 草草草视频在线观看| 国产一区一区| 欧美成人精品在线播放| 国产乱淫a∨片免费观看| 中文字幕制服丝袜一区二区三区| 99re精彩视频| 99精品一区| 51成人做爰www免费看网站| 黄色小网站在线观看| 欧美一区二区三级| 久久伊人成人网| yourporn久久国产精品| 免费国产黄色网址| 一区二区三区视频免费观看| 欧美一区二区.| 成人免费一区二区三区视频网站| 欧美精品一级二级| 免费中文字幕在线| www.欧美精品一二区| 国产免费黄视频| 精品国产成人| 成人精品久久久| 影音先锋男人资源在线| 亚洲国产精品va在看黑人| 久久久久久在线观看| 国产精品每日更新| www.51色.com| 亚洲毛片av| 欧美日韩综合网| 日本a人精品| 欧美高清视频在线播放| 天堂资源中文在线| 欧美剧在线免费观看网站| 久操免费在线视频| 久久新电视剧免费观看| 男女视频在线看| 欧美在线网址| 欧美精品一区二区三区在线四季 | 91免费版网站在线观看| 91丝袜在线| 伊人av综合网| 亚洲精品免费在线观看视频| 黑人巨大精品欧美一区二区免费| 精品熟妇无码av免费久久| 国产成人av电影免费在线观看| 青草青青在线视频| 青青草91久久久久久久久| 电影午夜精品一区二区三区| 欧美大胆成人| 久久91精品国产| 黄色大片在线看| 精品精品国产高清a毛片牛牛| 一级片免费在线播放| 亚洲品质自拍视频网站| 国产精品扒开腿做爽爽| 国产不卡在线播放| 向日葵污视频在线观看| 亚洲黄色毛片| 91制片厂免费观看| 女人丝袜激情亚洲| 国产精品亚洲综合| 色8久久久久| 国产精品极品在线| 韩国成人二区| 欧美日韩国产va另类| av在线免费观看网| 日韩成人在线观看| www.天堂在线| 欧美视频一区二区三区四区| 欧美三级一区二区三区| 亚洲品质自拍视频网站| 国产视频123区| 2021久久国产精品不只是精品| 欧美国产日韩在线视频 | 日本美女久久久| 蜜桃av一区二区在线观看| av免费观看网| 精品9999| 日韩精品免费一区| 久久久久久久久国产一区| 色播亚洲视频在线观看| 蜜桃一区二区三区| 欧美亚洲精品日韩| 天堂成人娱乐在线视频免费播放网站| 91精品免费| 久久wwww| 91久久久久久| **日韩最新| 国产一区在线播放| 亚洲影视资源| 国产在线精品成人一区二区三区| 另类中文字幕国产精品| 日韩av毛片网| 日本高清不卡一区二区三区视频| 91精品国产91久久久久久不卡| 欧美理论电影| 97激碰免费视频| 97久久人人超碰caoprom| 欧美国产日韩免费| 国产白丝在线观看| 久久免费精品视频| segui88久久综合9999| 国模视频一区二区| 校园春色亚洲| 日韩av高清不卡| 成人精品高清在线视频| 国产欧美精品va在线观看| 福利精品一区| 成人免费淫片视频软件| 99re8这里有精品热视频免费 | 国产成人精品999在线观看| 人偷久久久久久久偷女厕| 精品黄色一级片| 中文字幕一区二区中文字幕| 欧美激情亚洲| 免费国产a级片| 另类国产ts人妖高潮视频| 免费观看成人网| 久久成人免费网| 三级一区二区三区| 国产91精品久久久久久久网曝门| 久久福利小视频| 2020国产精品| 日本在线观看网址| 亚洲美女视频在线观看| 免费一级特黄特色大片| 黑人精品xxx一区一二区| 在线观看毛片网站| 日韩欧美国产午夜精品| 亚洲aaaaaaa| 伊人成人开心激情综合网| 成年人黄视频在线观看| 8090成年在线看片午夜| 欧美黄色网络| aa日韩免费精品视频一| 女厕嘘嘘一区二区在线播放 | 免费黄色片网站| 亚洲色图另类专区| 久草国产精品视频| 欧美日韩日日摸| 色噜噜在线播放| 日韩中文在线观看| 黑人巨大精品欧美一区二区桃花岛| 国产精品极品美女在线观看免费| 久久久久久久久久久久电影| 久久久久久久久一区二区| 日韩在线观看| 亚洲人成无码网站久久99热国产 | 欧美性做爰猛烈叫床潮| 国产黄色av片| 在线观看国产精品91| 成人女同在线观看| 国产精品自产拍在线观| 久久国产精品免费精品3p| 亚洲欧美久久234| 99综合在线| 久久久久久久久久久久久久久国产 | 制服下的诱惑暮生| 国产清纯白嫩初高生在线观看91| 精品99在线观看| 欧美日精品一区视频| 天堂在线视频网站| 欧美大片欧美激情性色a∨久久| 成人午夜精品| 国产一区二区三区奇米久涩| 亚洲欧洲日韩| 亚洲一级片网站| 久久久久99精品国产片| 免费看日韩毛片| 欧美xxx久久| caopo在线| 国产精品专区一| 成人三级视频| 精品久久久久av| 久久久亚洲精品一区二区三区| 国产一级视频在线观看| 制服丝袜激情欧洲亚洲| 成人h小游戏| 国产精品高清网站| 国产欧美日韩精品高清二区综合区| 日本中文字幕亚洲| 国产成人综合精品三级| 国产第一页浮力| 欧美日韩视频在线一区二区| 国产免费av在线| 国产精品av网站| 国内黄色精品| 老头吃奶性行交视频| 久久久久久一二三区| 天堂中文字幕在线观看| 亚洲精品福利在线| 美女露胸视频在线观看| 久久精品成人一区二区三区蜜臀| 一区视频在线看| 亚洲精品无码一区二区| 亚洲高清一区二区三区| 国产香蕉在线观看| 久久久久久成人| 99ri日韩精品视频| 日本一区午夜艳熟免费| 成人免费观看av| 免费黄色网址在线| 亚洲免费高清视频| 粉嫩一区二区三区| 亚洲国产欧洲综合997久久| 日韩av电影免费观看高清完整版| 人妻无码一区二区三区免费| 欧美日韩久久久| 在线观看午夜av| 国产精品入口免费| 久久福利影视| 又色又爽的视频| 日韩午夜在线观看| av蜜臀在线| 欧美日韩在线播放一区二区| 青青草国产成人av片免费| 国产免费一区二区三区四区| 日韩一级视频免费观看在线| 99在线视频影院| 欧洲在线视频一区| 美国av一区二区| 日韩免费一二三区| 亚洲美女性生活视频| 欧美美女福利视频| 美女扒开大腿让男人桶| 久久精品视频免费观看| 在线播放国产一区| 欧美日韩国产成人在线观看| 三级小说欧洲区亚洲区| 99视频在线视频| 一区二区三区鲁丝不卡| 污污的视频网站在线观看| 日韩av电影在线播放| 亚洲激情五月| 国产艳俗歌舞表演hd| 69久久99精品久久久久婷婷| а_天堂中文在线| 视频在线一区二区三区| 成人午夜在线播放| 中文字幕 人妻熟女| 韩剧1988在线观看免费完整版| 嫩草影视亚洲| 风韵丰满熟妇啪啪区老熟熟女| 色综合天天狠狠| 暖暖在线中文免费日本| 水蜜桃亚洲一二三四在线| 国产xxx精品视频大全| 中文字幕乱码无码人妻系列蜜桃| 欧美激情第1页|